[英]Run maven project from JAR with arguments from command line
嗨,我有一個maven項目使用了三個庫:junit,commons-lang,org.apache.commons。我的程序位於pl.parser.example.MainClass(使用main方法)位置;另外三個位於:Currency.java,CurrencyPojo.java ,CurrencyRates.java
我的主要方法:
public static void main(String[] args){
try {
String type = "c";
String currencyCode = args[0];
String inputStartDate = args[1];
String inputEndDate = args[2];
...
我無法從命令行運行此程序,我使用maven將其構建為jar文件並嘗試:
java -cp AreYouExample.jar pl.parser.example.MainClass EUR 2013-01-28 2013-01-31
但我有例外:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/ma
th3/stat/descriptive/DescriptiveStatistics
at pl.parser.example.CurrencyRates.obtainAvgPurchaseRate(
CurrencyRates.java:33)
at pl.parser.example.MainClass.main(MainClass.java:34)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.math3.stat.descr
iptive.DescriptiveStatistics
at java.net.URLClassLoader$1.run(Unknown Source)...
我認為跑步者看不到我在程序中使用的庫(從數學獲取平均數)
我沒有清單文件和類路徑文件。 當我嘗試運行jar時:
...> java MainClass EUR 2013-01-28 2013-01-31
然后我得到了例外:
Error: Could not find or load main class MainClass.java
但是當我將要與MainClass.java一起轉到文件夾並運行javaC MainClass.java時...編譯器無法找到程序中使用的符號,因為sumbols位於其他類中(在此文件夾/包中)
我認為我應該在堆棧溢出中插入我建議的這種情況下的主類, 在pom文件中進行構建,但這不起作用。
編輯:現在它起作用了,我像在其他overstackflow主題中一樣在POM文件中進行了更改,我插入了以下代碼:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>your.main.Class</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
您僅在啟動應用程序java -cp AreYouExample.jar
時在類路徑中指定jar,因此還需要將apache-commons
lib添加到類路徑中。
通常,在構建和准備分發應用程序時,我會在其中有一個lib目錄並配置maven復制您的依賴項,因此我的啟動腳本可以將它們全部添加到類路徑中並啟動應用程序。
您需要在jar中由maven創建的Manifest文件中的Main類。
Manifest-Version: 1.0
Main-Class: com.main class name
它顯然無法開始在jar中執行主程序
Error: Could not find or load main class MainClass.java
創建一個清單文件並在其中指定您的Main類。 然后,使用classpath選項-cp將所有值傳遞給jar文件,例如屬性文件。 當您從命令行執行jar時,所有公共庫jar都將由maven自動加載。
如果只運行程序而不告訴Java所有庫類都在哪里,那么您將確切地獲得NoClassDefFoundError
。
有幾種方法可以正確運行程序。
java -jar YourJarFile.jar
此命令需要JAR文件中的清單文件。 此清單必須包含兩個屬性Main-Class
和Class-Path
。 對於您的程序,清單文件中的此類路徑屬性必須包含您正在使用的庫
java -cp <jar-file> your.pkg.MainClass
該命令在命令中明確聲明類路徑,該類路徑現在必須只是您自己的JAR文件。 然后,它還聲明應運行其主方法的主類。 這意味着清單中不再需要Main-Class屬性。 但是您仍然需要Class-Path屬性來查找使用的庫。
java -cp <jar-file>;<lib1>;<lib2>;... your.pkg.MainClass
使用此命令,您不再需要任何顯式清單。 只需將您自己的JAR文件和庫放入專有類路徑(在comman內部)。
使用Maven,您可以告訴歸檔程序如何創建清單。 另外,您可以讓Maven創建整個發行版。 看一下Assembly插件 。
我前段時間也遇到過類似的問題。 如果您從eclipse運行maven並且未在項目中定義源文件夾,則eclipse maven插件將不知道要編譯什么,因此不會將任何類添加到jar(檢查您的maven日志並查看是否添加了類)。 因此,您應該向自己保證src / main / java已添加到eclipse項目中。 檢查項目屬性的構建路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.