2014-03-26 167 views
0

您好我有一個maven項目使用三個庫:junit,commons-lang,org.apache.commons 我的程序位於位置pl.parser.example.MainClass(與主要方法)和其他三人:Currency.java,CurrencyPojo.java,CurrencyRates.java從JAR使用參數從命令行運行maven項目

我的主要方法:

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)... 

我覺得運動員不能看到的圖書館,我在程序中使用(以得到每場數學計數)

我don'thave清單文件,並類路徑文件。當我試圖運行罐子:

...> java MainClass EUR 2013-01-28 2013-01-31 

然後我得到異常:

Error: Could not find or load main class MainClass.java 

但是,當我將去MainClass.java到文件夾和運行javac MainClass.java ......然後compiller無法找到因爲sumbols位於其他類(在這個文件夾/包)

我認爲我應該插入一個主類,我建議這種情況下堆棧溢出,build in pom file,但不起作用。

編輯: 現在的作品,我做了像other overstackflow topic 我insertet這個代碼在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> 

回答

0

你只是指定你的罐子在classpath中你的時候'重新啓動應用程序java -cp AreYouExample.jar,因此您需要將apache-commons lib也添加到類路徑中。

通常構建和準備分發您的應用程序時,我就會有一個lib目錄,配置Maven複製你的依賴在那裏,所以我的啓動腳本可以將它們全部添加到類路徑和啓動應用程序。

+0

但是如何在java項目中添加classPath? – MikeB

+0

您已將您的jar添加到類路徑'java -cp AreYouExample.jar'。你可以在windows上使用';'分隔多個jar,在* nix上使用':',比如'java -cp jar1; jar2; jarN com.sample.MyClass'。你可以在這裏閱讀更多關於它的信息:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html – Morfic

0

需要在已被行家創建你的JAR清單文件,一個主類。

Manifest-Version: 1.0 
Main-Class: com.main class name 

這顯然是不能夠開始在罐子

Error: Could not find or load main class MainClass.java 

執行主程序創建一個清單文件,並有指定的主類。 然後使用類路徑選項-cp將任何值傳遞到您的jar,如屬性文件。 當您從命令行執行jar時,所有常用庫jar會自動被maven加載。

0

如果你只有在所有的庫類駐留運行,你沒有告訴Java程序,你會正好拿到NoClassDefFoundError

有幾種可能性正確運行您的程序

  • java -jar YourJarFile.jar

這個命令需要一個manifest file JAR文件的內部。該清單必須包含Main-ClassClass-Path這兩個屬性。對於你的程序清單文件這個類路徑屬性必須包含的庫您所使用

  • java -cp <jar-file> your.pkg.MainClass

該指令明確地指出在命令,現在必須是簡單的你自己類路徑JAR文件。然後它還說明主要類,它的主要方法應該運行。這意味着您不再需要清單中的Main-Class屬性。但是您仍然需要Class-Path屬性來查找使用的庫。

  • java -cp <jar-file>;<lib1>;<lib2>;... your.pkg.MainClass

用這個命令你不需要任何明確的表現了。簡單地把你自己的JAR文件和庫放到excplicit類路徑中(在comman裏面)。


使用Maven,您可以告訴歸檔器如何創建清單。另外,你可以讓Maven創建整個發行版。看看assembly plugin

0

前段時間我有類似的問題。如果你從eclipse運行你的maven,並且你沒有在你的項目中定義你的源文件夾,那麼你的eclipse maven插件將不知道要編譯什麼,所以沒有類將被添加到jar(檢查你的maven日誌,並看到它添加你的類)。所以你應該向你自己保證src/main/java被添加到eclipse項目中。檢查你的項目屬性構建路徑。

相關問題