Как поместить все необходимые файлы JAR в папку библиотеки внутри окончательного файла JAR с Maven?
Я использую Maven в своем автономном приложении, и я хочу упаковать все зависимости в моем файле JAR внутри папки библиотеки, как указано в одном из ответов здесь:
как я могу создать исполняемый JAR с зависимостями с помощью Maven?
Я хочу, чтобы мой последний файл JAR имел папку библиотеки, содержащую зависимости в виде файлов JAR, а не то, что maven-shade-plugin что ставит зависимости в виде папок, таких как Иерархия Maven в the .папка м2.
ну, на самом деле текущая конфигурация делает то, что я хочу, но у меня возникли проблемы с загрузкой файлов 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.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.
как я могу исправить это исключение?
8 ответов:
следующее мое решение. Проверьте его, если он работает для вас:
<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>test.org.Cliente</mainClass> --> </manifest> <manifestEntries> <Class-Path>lib/</Class-Path> </manifestEntries> </archive> </configuration> </plugin>первый плагин помещает все зависимости в папку target / classes / lib, а второй включает папку библиотеки в окончательный файл JAR и настраивает .
но тогда вам нужно будет добавить пользовательский код загрузки классов для загрузки файлов JAR.
или, чтобы избежать пользовательской загрузки классов, вы можете использовать "${project.строить.каталог}/lib, но в этом случае, у вас нет зависимости внутри конечного файла JAR, который побеждает цель.
прошло два года с тех пор, как был задан этот вопрос. Тем не менее проблема вложенных файлов JAR сохраняется. Надеюсь, это кому-то поможет.
обновление:
<build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>
самый простой и эффективный способ-использовать плагин uber следующим образом:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> <configuration> <finalName>uber-${artifactId}-${version}</finalName> </configuration> </plugin>вы будете де-нормализованы все в одном файле JAR.
The исполняемый Пакер Maven плагин может использоваться именно для этой цели: создание автономных приложений java, содержащих все зависимости в виде файлов JAR в определенной папке.
просто добавьте следующее к вашему
pom.xmlвнутри<build><plugins>раздел (обязательно замените значениеmainClassсоответственно):<plugin> <groupId>de.ntcomputer</groupId> <artifactId>executable-packer-maven-plugin</artifactId> <version>1.0.1</version> <configuration> <mainClass>com.example.MyMainClass</mainClass> </configuration> <executions> <execution> <goals> <goal>pack-executable-jar</goal> </goals> </execution> </executions> </plugin>встроенный файл JAR находится по адресу
target/<YourProjectAndVersion>-pkg.jarпосле запускаmvn package. Все его зависимости времени компиляции и выполнения будут входит вlib/папка внутри файла JAR.отказ от ответственности: я автор плагина.
перейдя по этой ссылке:
Как установить Eclipse Maven build jar с зависимостями
Я обнаружил, что это не работоспособное решение, потому что загрузчик классов не загружает банки из банок, поэтому я думаю, что я распакую зависимости внутри банки.
вот как я делаю это:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.project.MainClass</mainClass> </manifest> </archive> </configuration> </plugin>а потом я просто убегу:
mvn assembly:assembly
Я нашел ответ на вопрос:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
вы не только получаете зависимые файлы lib в папке lib, вы также получаете директор bin с исполняемым файлом unix и dos.
исполняемый файл в конечном итоге вызывает java с аргументом-cp, который также перечисляет все ваши зависимые библиотеки.
вся партия сидит в папке appasembly внутри целевая папка. Эпический.
============= Да, я знаю, что это старая тема, но она все еще высоко ценится в результатах поиска, поэтому я подумал, что это может помочь кому-то вроде меня.
Это явно проблема classpath. Примите во внимание, что путь к классам должен немного измениться при запуске программы вне среды IDE. Это связано с тем, что IDE загружает другие банки относительно корневой папки вашего проекта, в то время как в случае окончательной банки это обычно не так.
то, что я хотел бы сделать в этих ситуациях, это построить банку вручную. Это занимает у меня не более 5 минут и она всегда решает проблему. Я не предлагаю вам этого делать. Найти способ использования Мэйвен, это его цель.
Comments