2015-12-03 57 views
0

與IntelliJ IDEA的創建工作罈子,我想要實現以下幾點:的IntelliJ Maven的:所有的函數庫的依賴

我想申請導出到一個罐子,其中包含所有需要的庫。例如。我需要爲S3的訪問AWS的Java SDK庫,但如果我上傳的jar到服務器並運行jar我得到的NoClassDefFoundError,見下圖:

Exception in thread "main" java.lang.NoClassDefFoundError: com/amazonaws/auth/AWSCredentials 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2625) 
    at java.lang.Class.getMethod0(Class.java:2866) 
    at java.lang.Class.getMethod(Class.java:1676) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentials 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 6 more 

比較:我在Eclipse中創建的同一個項目,並得到沒有錯誤! jar文件的大小是非常不同的(Eclipse:〜35 MB vs. IntelliJ Idea:〜5.5 MB)!

我包括通過Maven的庫並下載他們還到我的項目的「LIB」文件夾: enter image description here

enter image description here

正如運行配置參數我設置「包」,看看下面的截圖: enter image description here

SOLUTION:

感謝您的所有提示,我現在就可以開始工作!訣竅是我沒有添加依賴到pom.xml文件(因爲我認爲這將在Project Structure中設置後自動完成,但它沒有)!另見我的另一個問題:Intellij IDEA Maven Plugin - Manage Dependencieshttps://www.jetbrains.com/idea/help/maven.html!通過

  1. 打開pom.xml中添加依賴
  2. 菜單 「代碼」> 「生成」> 「依賴」(或快捷鍵ALT + INSERT)
+0

你可以顯示你的pom.xml文件嗎?看起來你並沒有聲明依賴關係。 –

+0

我通過UI設置依賴關係,請參閱上面的截圖。我添加了我的pom.xml的屏幕截圖... –

+2

實際上,依賴關係未包含在您的項目中。請注意,您的pom中缺少''塊。你必須手動包含它們。 –

回答

4

你需要使用Maven Assembly插件以包括依賴關係:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <archive> 
      <manifest> 
      <mainClass>your.package.MainClass</mainClass> 
      </manifest> 
     </archive> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

然後:mvn clean compile assembly:single

+0

感謝您的快速回答,我會試一試。我應該在哪裏輸入「mvn clean compile assembly:single」命令?在我有「包」的參數選項卡中?對不起,我是Maven的新手...... –

+1

是的,在「命令行」輸入中,您必須將'clean compile assembly:single'。這些是你想要執行的*目標*。'清理'建立目錄,''編譯'項目,最後'彙編'它。 –

+0

謝謝你的回答,大人物!但是現在我又收到了一條錯誤消息,請參閱我編輯的問題。 –

1

我建議THA你使用插件shade。它比Assembly更好,因爲如果發生衝突,可能對relocate classes

典型的設置可以是這樣的:(從official documentation複製)

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.4.2</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <artifactSet> 
       <excludes> 
        <exclude>classworlds:classworlds</exclude> 
        <exclude>junit:junit</exclude> 
        <exclude>jmock:*</exclude> 
        <exclude>*:xml-apis</exclude> 
        <exclude>org.apache.maven:lib:tests</exclude> 
        <exclude>log4j:log4j:jar:</exclude> 
       </excludes> 
       </artifactSet> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

如果大小是很重要的,你可以嘗試使用<minimizeJar>true</minimizeJar>減小尺寸。

+0

謝謝,但似乎我得到了與問題編輯中解釋的相同的錯誤...我設置爲「清理編譯包」的目標 - 這是正確的嗎? –

+0

我沒有閱讀@bigdestroyer的評論,但他是正確的,maven將只包含它處理的依賴關係。如果您有任何公共可用存儲庫中不存在的jar,則可以將其添加到本地存儲庫或設置存儲庫(已優先選擇)。 http://www.mkyong.com/maven/how-to-include-library-manully-into-maven-local-repository/ – emanciperingsivraren

+0

我添加了項目的.iml文件,其中列出了依賴關係。 –