2015-12-03 4 views
0

Работы с IntelliJ Idea, я хочу реализовать следующее:Intellij Maven: Создание баночки со всеми зависимостями библиотеки

Я хочу экспортировать приложение к банку, который содержит все необходимые библиотеки. Например. Мне нужны библиотеки AWS Java SDK для доступа к S3, но если я загрузить банку на сервер и запустить баночку я получаю 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 МБ против IntelliJ Idea: ~ 5,5 МБ)!

Я включил библиотеки через Maven и загрузить их также в «Lib» папку моего проекта: enter image description here

enter image description here

В качестве параметра в конфигурации прогона я поставил «пакет», см скриншот ниже : enter image description here

РЕШЕНИЕ:

Спасибо за все ваши намеки, я получил его сейчас! Хитрость заключалась в том, что я не добавлял зависимости к файлу pom.xml (потому что я думал, что это будет сделано автоматически после установки их в структуре проекта, но это не так) !!! См. Также мой другой вопрос: Intellij IDEA Maven Plugin - Manage Dependencies и https://www.jetbrains.com/idea/help/maven.html! Добавьте зависимости от

  1. Открыть pom.xml
  2. меню "Код"> "Создать"> "Зависимость" (или ярлык ALT + INSERT)
+0

Вы можете показать свой pom.xml-файл? Кажется, что вы не объявляете зависимости. –

+0

Я устанавливаю зависимости через пользовательский интерфейс, см. Скриншоты выше. Я добавляю скриншот моего 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'. Это * цели *, которые вы хотите выполнить.'clean' каталог сборки,' compile' и, наконец, 'assembly' it. –

+0

Спасибо за ваш ответ, bigdestroyer! Но теперь я получаю еще одно сообщение об ошибке, см. Мое редактирование вопроса. –

1

Я рекомендую ТНА t вы используете плагин 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 будет включать только зависимости, которые он обрабатывает. Если у вас есть банки, которые не существуют в каких-либо общедоступных репозиториях, вы можете добавить их в свой локальный репозиторий или настроить репозиторий (preffered). http://www.mkyong.com/maven/how-to-include-library-manully-into-maven-local-repository/ – emanciperingsivraren

+0

Я добавил файл .iml проекта, в котором перечислены зависимости. –

Смежные вопросы