Я использую Maven в своем автономном приложении и хочу упаковать все зависимости в моем файле JAR в папку библиотеки, как указано в одном из ответов здесь:
Как я могу создать исполняемый JAR с зависимостями с помощью Maven?
Я хочу, чтобы в моем последнем файле JAR была папка библиотеки, содержащая зависимости в виде файлов JAR, а не то, maven-shade-plugin
что помещает зависимости в виде папок, таких как иерархия Maven в папке .m2.
На самом деле текущая конфигурация делает то, что я хочу, но у меня проблема с загрузкой файлов JAR при запуске приложения. Я не могу загрузить классы.
Вот моя конфигурация:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
Проект отлично работает в Eclipse, и файлы JAR помещаются в папку библиотеки внутри моего последнего файла JAR, как я хочу, но при запуске последнего файла JAR из целевой папки я всегда получаю ClassNotFoundException
:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.
Как я могу исправить это исключение?
источник
com.myapp.MainClass
ищется, а неcom.tastycafe.MainClass
.Ответы:
Вот мое решение. Проверьте, работает ли он для вас:
Первый плагин помещает все зависимости в папку target / classes / lib, а второй включает папку библиотеки в окончательный файл JAR и настраивает
Manifest.mf
файл.Но тогда вам нужно будет добавить собственный код загрузки классов для загрузки файлов JAR.
Или, чтобы избежать пользовательской загрузки классов, вы можете использовать "$ {project.build.directory} / lib, но в этом случае у вас нет зависимостей внутри окончательного файла JAR, что противоречит цели.
Прошло два года с тех пор, как был задан вопрос. Тем не менее проблема вложенных файлов JAR сохраняется. Надеюсь, это кому-то поможет.
источник
Обновлено:
источник
Самый простой и эффективный способ - использовать такой плагин uber:
У вас все будет денормализовано в одном JAR-файле.
источник
Упаковщик исполняемых Maven плагин может быть использован именно для этой цели: создание автономного Java - приложений , содержащих всю зависимость , как JAR - файлы в папке конкретной.
Просто добавьте следующую строку в ваш
pom.xml
внутри<build><plugins>
секции (не забудьте заменить значениеmainClass
соответственно):Созданный файл JAR
target/<YourProjectAndVersion>-pkg.jar
после запуска находится вmvn package
. Все его зависимости времени компиляции и выполнения будут включены вlib/
папку внутри файла JAR.Отказ от ответственности: я являюсь автором плагина.
источник
по этой ссылке:
Как: Eclipse Maven установить сборку сборки с зависимостями
Я обнаружил, что это неработоспособное решение, потому что загрузчик классов не загружает банки изнутри, поэтому я думаю, что распакую зависимости внутри банки.
источник
Вот как я это делаю:
А потом просто бегу:
источник
assembly
вы просто поместите все, что находится в "target / classes" в JAR. Это гарантирует, что JAR будет включать все изменения, которые вы недавно внесли в исходный код. Таким образом, вы должны сделать что - то вроде:mvn clean compile assembly:assembly
.Я нашел такой ответ на вопрос:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
Вы не только получаете зависимые файлы lib в папке lib, но и получаете директорию bin с исполняемыми файлами unix и dos.
В конечном итоге исполняемый файл вызывает java с аргументом -cp, который также перечисляет все ваши зависимые библиотеки.
Вся партия находится в папке appasembly внутри целевой папки. Эпично.
============= Да, я знаю, что это старая ветка, но она все еще занимает высокие позиции в результатах поиска, поэтому я подумал, что это может помочь кому-то вроде меня.
источник
Это явно проблема пути к классам. Учтите, что путь к классам должен немного измениться, когда вы запускаете свою программу вне IDE. Это связано с тем, что среда IDE загружает другие файлы JAR относительно корневой папки вашего проекта, тогда как в случае окончательного JAR это обычно неверно.
Что мне нравится делать в таких ситуациях, так это создавать JAR вручную. На это у меня уходит максимум 5 минут, и это всегда решает проблему. Я не предлагаю вам этого делать. Найдите способ использовать Maven, в этом его цель.
источник