как поместить все необходимые файлы jar в папку библиотеки внутри окончательного файла jar с maven?

<p>я использую maven в своем автономном приложении и хочу упаковать все зависимости в моем jar-файле в папку библиотеки, как указано в одном из ответов здесь:</p><p><em> <a href="https://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven">как я могу создать исполняемый jar с зависимостями, используя maven?</a> </em></p><p>я хочу, чтобы у моего окончательного файла jar была папка библиотеки, которая содержит зависимости в виде файлов jar, а не то, что <code>maven-shade-plugin</code>, который помещает зависимости в виде папок, таких как иерархия maven, в папке .m2.</p><p>ну, на самом деле текущая конфигурация делает то, что я хочу, но у меня проблема с загрузкой файлов jar при запуске приложения. я не могу загрузить классы.</p><p>вот моя конфигурация:</p><pre class="lang-xml prettyprint-override"><code><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> install <phase>install</phase> <goals> sources </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. как я могу исправить это исключение?

по этой ссылке: <a href="https://stackoverflow.com/questions/10019549/how-to-eclipse-maven-install-build-jar-with-dependencies">как: eclipse maven установить сборку jar с зависимостями я обнаружил, что это нереализуемое решение, потому что загрузчик классов не загружает jar-файлы из jar-файлов, поэтому я думаю, что распакую зависимости внутри jar-файла.

следующее моё решение. проверьте это, если это работает для вас:<pre class="lang-xml prettyprint-override"><plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-dependency-plugin</artifactid> <executions> <execution> copy-dependencies <phase>prepare-package</phase> <goals> copy-dependencies </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> </code></pre><p>первый плагин помещает все зависимости в папку target/classes/lib, а второй включает папку библиотеки в окончательный файл jar и настраивает файл <code>manifest.mf</code>.</p><p>но тогда вам нужно будет добавить собственный код загрузки классов для загрузки файлов jar.</p><p>или, чтобы избежать пользовательской загрузки классов, вы можете использовать "$ {project.build.directory}/lib, но в этом случае у вас нет зависимостей внутри конечного файла jar, что противоречит цели.прошло два года с тех пор, как был задан вопрос. проблема вложенных jar-файлов все же сохраняется. надеюсь, это кому-нибудь поможет.

обновлено:<build> <plugins> <plugin> <artifactid>maven-dependency-plugin</artifactid> <executions> <execution> <phase>install</phase> <goals> copy-dependencies </goals> <configuration> <outputdirectory>${project.build.directory}/lib</outputdirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </code></pre>

<p>самый простой и эффективный способ - использовать uber-плагин, например так:</p><pre><code> <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> </code></pre><p>вы будете де-нормализовать все в одном файле jar.</p>

<p> <a href="https://github.com/nthuemmel/executable-packer-maven-plugin">исполняемый подключаемый модуль упаковщика maven</a> можно использовать именно для этой цели: создания автономных java приложений, содержащих все зависимости в виде jar-файлов в определенной папке.</p><p>просто добавьте следующее в свой <code>pom.xml</code> внутри раздела <code><build><plugins></code> (обязательно замените значение <code>mainclass</code> соответственно):</p><pre><code><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> </code></pre><p>встроенный файл jar находится по адресу <code>target/<yourprojectandversion>-pkg.jar</code> после запуска <code>mvn package</code>. все его зависимости времени компиляции и времени выполнения будут включены в папку <code>lib/</code> внутри файла jar.</p><p>отказ от ответственности: я автор плагина.</p>

<p>вот как я это делаю:</p><pre><code> <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> </code></pre><p>и тогда я просто бегу:</p><pre><code>mvn assembly:assembly </code></pre>

<p>я нашел этот ответ на вопрос:</p><p> <a href="http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html">http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html</a> </p><p>вы не только получаете зависимые файлы lib в папке lib, вы также получаете директорию bin с исполняемым файлом unix и dos.</p><p>в конечном итоге исполняемый файл вызывает java с аргументом -cp, который также перечисляет все ваши зависимые библиотеки.</p><p>вся партия находится в папке appasembly внутри целевой папки. эпическая.</p><p>============= да, я знаю, что это старая ветка, но она все еще пользуется большим успехом в результатах поиска, поэтому я подумала, что она может помочь кому-то вроде меня.</p>

<p>это явно проблема classpath. примите во внимание, что путь к классу должен немного измениться, когда вы запускаете свою программу вне ide. это связано с тем, что ide загружает другие jar-файлы относительно корневой папки вашего проекта, в то время как в случае окончательного jar-файла это обычно не так.</p><p>в этих ситуациях мне нравится делать jar вручную. у меня уходит не более 5 минут, и это всегда решает проблему. я не предлагаю вам сделать это. найти способ использовать maven, это его цель.</p>