Я наткнулся на ту же проблему. Программа отлично работала от Eclipse с помощью кнопки «Запустить», но не из запускаемого JAR, который я ранее экспортировал. Мое решение было:
1) Переместить основной класс в пакет по умолчанию
2) Установить другой путь для Eclipse и другие во время работы из файла JAR (вставить это в Main.java)
public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
File x = getCurrentJarFileLocation();
if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
return false;
} else {
return true;
}
}
public static File getCurrentJarFileLocation() {
try {
return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
} catch(URISyntaxException e){
e.printStackTrace();
return null;
}
}
И после этого в методе начала вам необходимо загрузить такие файлы:
FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));
Это работает для меня на Eclipse Mars с e (fx) клише. / g4]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
, и вы запускаете его с помощью
mvn clean compile assembly:single
. Перед сборкой следует добавить цель компиляции: одинарная или иначе код в вашем собственном проекте не включен.
Подробнее см. в комментариях.
Обычно эта цель привязана к фазе сборки для автоматического выполнения. Это гарантирует создание JAR при выполнении mvn install
или выполнении развертывания / выпуска.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Вы также можете использовать этот плагин, он довольно хорош, и я использую его для упаковки моих банок http://sonatype.github.io/jarjar-maven-plugin/
Чтобы решить эту проблему, мы будем использовать Maven Assembly Plugin, который будет создавать JAR вместе со своими JAR-зависимостями в один исполняемый JAR-файл. Просто добавьте ниже конфигурацию плагина в файл pom.xml.
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.your.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
После этого не забудьте запустить средство MAVEN с помощью этой команды mvn clean compile assembly: single
Добавить в pom.xml:
<dependency>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
</dependency>
и
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
Thats it. Следующий пакет mvn также создаст еще одну жировую банку, включая все банки с зависимостями.
Вы можете добавить следующее в свой pom.xml:
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
. Затем вам нужно переключиться с консоли в каталог, где находится pom.xml. Затем вам нужно выполнить сборку mvn: single, а затем ваш исполняемый JAR-файл с зависимостями, мы надеемся, будет построен. Вы можете проверить его при переключении на выходной (целевой) каталог с помощью cd ./target и запустить свою банку с помощью команды, аналогичной java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar.
Я тестировал это с Apache Maven 3.0.3.
Плагин maven-assembly-plug отлично работал для меня. Я часами сидел с плагином maven-dependency и не мог заставить его работать. Основная причина заключалась в том, что я должен был явно определить в разделе конфигурации элементы артефакта, которые должны быть включены, как описано в документации . Например, есть случаи, когда вы хотите использовать его, например: mvn dependency:copy
, где нет каких-либо артефактов, но он не работает.
Длинный использовал плагин сборки maven, но я не мог найти решение проблемы с "already added, skipping"
. Теперь я использую другой плагин - onejar-maven-plugin . Пример ниже (mvn package
build jar):
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<configuration>
<mainClass>com.company.MainClass</mainClass>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
Вам нужно добавить репозиторий для этого плагина:
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>
Я прошел через каждый из этих ответов, пытаясь сделать жирный исполняемый фляга, содержащую все зависимости, и никто из них не работал правильно. Ответ - плагин с оттенками, очень простой и понятный.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>path.to.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Имейте в виду, что ваши зависимости должны иметь объем компиляции или времени выполнения, чтобы это нормально работало.
Вы можете использовать плагин зависимости, чтобы генерировать все зависимости в отдельном каталоге до фазы пакета, а затем включать это в путь к классам манифеста:
<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}/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>theMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Альтернативно использовать ${project.build.directory}/classes/lib
как OutputDirectory для интеграции всех jar-файлов в основную банку, но тогда вам нужно будет добавить пользовательский код загрузки классов для загрузки банок.
${project.build.directory}/classes/lib
как outputDirectory
, чтобы иметь один основной .jar со всеми зависимостями внутри, но - как добавить пользовательский код загрузки классов для загрузки этих банок? Мне нужно выполнить выполнение работы, например: java -jar main-jar-with-deps.jar
. Это возможно ?
– marioosh
13 March 2012 в 21:09
Это лучший способ, которым я нашел:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myDomain.etc.MainClassName</mainClass>
<classpathPrefix>dependency-jars/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/dependency-jars/
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
В этой конфигурации все зависимости будут расположены в /dependency-jars
. Мое приложение не имеет классов Main
, а только контекстных, но одна из моих зависимостей имеет класс Main
(com.myDomain.etc.MainClassName
), который запускает сервер JMX, и получает параметр start
или stop
. Поэтому с этим я смог запустить свое приложение следующим образом:
java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start
Я жду, что он будет полезен для всех вас.
Я сравнил плагины деревьев, упомянутые в этом посте. Я создал 2 баночки и каталог со всеми банками. Я сравнил результаты и, безусловно, лучший плагин maven-shade. Моя задача заключалась в том, что у меня есть несколько ресурсов, которые нужно объединить, а также jax-rs и JDBC-сервисы. Они были полностью объединены плагином с оттенком по сравнению с плагином maven-assembly-plugin. В этом случае пружина будет терпеть неудачу, если вы не скопируете их в папку собственных ресурсов и не объедините их вручную один раз. Оба плагина выводят правильное дерево зависимостей. У меня было несколько областей, таких как тестирование, предоставление, компиляция и т. Д. Тест и предоставленные были пропущены обоими плагинами. Они оба выпустили один и тот же манифест, но я смог консолидировать лицензии с помощью плагина с использованием своего трансформатора. Разумеется, с плагином maven-dependency у вас нет этих проблем, потому что банки не извлекаются. Но, как и некоторые другие, вы указали, что вам нужно иметь один дополнительный файл (ы) для правильной работы. Ниже приведен фрагмент pom.xml
<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}/lib</outputDirectory>
<includeScope>compile</includeScope>
<excludeTransitive>true</excludeTransitive>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.rbccm.itf.cdd.poller.landingzone.LandingZonePoller</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<shadedArtifactAttached>false</shadedArtifactAttached>
<keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
Что-то, что сработало для меня, было:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>SimpleKeyLogger</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
У меня был необычный случай, потому что моя зависимость была системной:
<dependency>
..
<scope>system</scope>
<systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>
Я изменил код, предоставленный @ user189057 с изменениями: 1) maven-dependency-plugin выполняется в фазе «подготовка-пакет» 2) Я извлекаю распакованную classess непосредственно в «target / classes»
В этом сообщении блога показан другой подход с объединением плагинов maven-jar и maven-assembly. С конфигурацией xml сборки из сообщения в блоге она также может управляться, если зависимости будут расширены или просто будут собраны в папке и указаны в элементе pathpath в файле:
Идеальное решение для включения баннеров в папку lib, а файл manifest.mf основной банки включает все банки в пути к классам.
И именно это описано здесь: https: / /caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
Вот исполняемый плагин jar для Maven, который мы используем в Credit Karma. Он создает банку банок с загрузчиком классов, способным загружать классы из вложенных банок. Это позволяет вам иметь один и тот же путь к классам в dev и prod и все еще держать все классы в одном подписанном файле jar.
https://github.com/creditkarma/maven-exec-jar- plugin
И вот сообщение в блоге с подробностями о плагине и почему мы это сделали: https://engineering.creditkarma.com/general-engineering/new-executable-jar -plugin-имеющиеся в наличии апаша-Maven /
Используйте плагин maven-shade для упаковки всех зависимостей в одну uber-jar. Его также можно использовать для создания исполняемого банку, указав основной класс. Попробовав использовать maven-assembly и maven-jar, я обнаружил, что этот плагин лучше всего подходит для моих потребностей.
Я нашел этот плагин особенно полезным, так как он объединяет содержимое определенных файлов, а не перезаписывает их. Это необходимо, когда есть файлы ресурсов, которые имеют одно и то же имя в банках, и плагин пытается упаковать все файлы ресурсов
. См. Пример ниже
<plugins>
<!-- This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<!-- signed jars-->
<excludes>
<exclude>bouncycastle:bcprov-jdk15</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Main class -->
<mainClass>com.main.MyMainClass</mainClass>
</transformer>
<!-- Use resource transformers to prevent file overwrites -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>properties.properties</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>applicationContext.xml</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/cxf.extension</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/cxf/bus-extensions.xml</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Это должно быть так:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
Распаковка должна быть в фазе генерации ресурсов, потому что, если в фазе пакета не будут включены в качестве ресурсов. Попробуйте очистить пакет, и вы увидите.
Кен Лю прав, на мой взгляд. Плагин зависимостей maven позволяет вам расширять все зависимости, которые затем можно рассматривать как ресурсы. Это позволяет включить их в артефакт main . Использование плагина сборки создает вторичный артефакт, который может быть трудно модифицировать - в моем случае я хотел добавить пользовательские записи манифеста. Мой pom оказался следующим:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
<targetPath>/</targetPath>
</resource>
</resources>
</build>
...
</project>
Еще один вариант, если вы действительно хотите переупаковать другое содержимое JAR внутри вашего единственного результирующего JAR, это плагин сборки Maven . Он распаковывает и затем перегружает все в каталог через <unpack>true</unpack>
. Затем у вас будет второй проход, который встроил бы его в один массив JAR.
Другим вариантом является плагин OneJar . Это выполняет вышеупомянутые действия по переупаковке всего за один шаг.
Если вы хотите, если из командной строки. Просто запустите команду ниже с пути к проекту
mvn assembly: assembly
pom.xml
, иначе вы получите Error reading assemblies: No assembly descriptors found.
. Это все равно для меня.
– Sridhar-Sarnobat
8 September 2017 в 18:59
Принимая ответ Unanswered и переформатируя его, мы имеем:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
Далее я бы рекомендовал сделать это естественной частью вашей сборки, а не чем-то явно. Чтобы сделать это неотъемлемой частью вашей сборки, добавьте этот плагин к своему pom.xml
и привяжите его к событию lifecycle package
. Однако получить то, что вам нужно называть цель assembly:single
, если вы помещаете это в свой pom.xml, в то время как вы вызываете «сборка: сборка», если вы выполняете его вручную из командной строки.
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
[...]
</plugins>
[...]
</build>
</project>
Вы можете использовать плагин maven-shade для сборки uber jar, как показано ниже
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
Проблема с размещением файла общей сборки с помощью maven-assembly-plugin-2.2.1?
Попробуйте использовать параметр конфигурации descriptorId вместо параметров дескрипторов / дескрипторов или дескрипторовRefs / descriptorRef.
Ни один из них не делает то, что вам нужно: найдите файл в classpath. Конечно, вам нужно добавить пакет, в котором общая сборка находится на пути класса maven-assembly-plugin (см. Ниже). Если вы используете Maven 2.x (not Maven 3.x), вам может понадобиться добавить эту зависимость в самый верхний pom.xml родителя в разделе pluginManagement.
См. this для получения дополнительной информации.
Класс: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Пример:
<!-- Use the assembly plugin to create a zip file of all our dependencies. -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorId>assembly-zip-for-wid</descriptorId>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>cz.ness.ct.ip.assemblies</groupId>
<artifactId>TEST_SharedAssemblyDescriptor</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
Уже есть миллионы ответов, я хотел добавить, что вам не нужно <mainClass>
, если вам не нужно добавлять entryPoint в ваше приложение. Например, API могут не иметь метода main
.
<build>
<finalName>log-enrichment</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
mvn clean compile assembly:single
ll target/
total 35100
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ./
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ../
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 archive-tmp/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 classes/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-sources/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-test-sources/
-rwxrwx--- 1 root vboxsf 35929841 Sep 29 16:10 log-enrichment-jar-with-dependencies.jar*
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 maven-status/
Я попробовал самый опротестованный ответ здесь, и смог получить флягу. Но программа работает неправильно. Я не знаю, в чем причина. Когда я пытаюсь запустить с Eclipse
, я получаю другой результат, но когда я запускаю jar из командной строки, я получаю другой результат (он выходит из строя с ошибкой времени выполнения программы).
I имел аналогичное требование, как OP только, что у меня было слишком много (Maven) зависимостей для моего проекта. К счастью, единственным решением, которое сработало для меня, было то, что с помощью Eclipse
. Очень просто и очень просто. Это не решение для OP, а решение для тех, кто имеет аналогичное требование, но со многими зависимостями Maven,
1) Просто щелкните правой кнопкой мыши по папке проекта (в Eclipse) и выберите Export
2) Затем выберите Java
-> Runnable Jar
3) Вам будет предложено выбрать расположение файла jar
4) Наконец, выберите класс, у которого есть метод Main, который вы хотите запустить, и выберите Package dependencies with the Jar file
и нажмите Finish
Это также может быть вариант, вы сможете создать свой файл jar
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>WordListDriver</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Я не буду напрямую отвечать на этот вопрос, как это уже делали другие, но я действительно задаюсь вопросом, стоит ли вставлять все зависимости в jar самого проекта.
Я вижу точку (простота развертывания / использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. ниже)).
Если вы используете его полностью автономно, почему бы и нет.
Но если вы используете свой проект в других контекстах (например, в webapp или забрасываете в папку, где сидят другие банки), у вас могут быть дубликаты дубликатов в вашем пути к классам (те, которые находятся в папке, то есть в банках ). Возможно, это не сделка с предложением, но я обычно избегаю этого.
Хорошая альтернатива:
Как и в случае с манифестом и «специальным динамическим классом загрузчика», вы может начать свой проект с:
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
Вы можете использовать maven-dependency-plugin, но вопрос заключается в том, как создать исполняемый JAR. Для этого требуется следующее изменение в ответе Мэтью Франглен (кстати, использование плагина зависимостей занимает больше времени, чтобы строить при запуске с чистой цели):
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
</resource>
</resources>
</build>
Я писал о различных способах этого.
См. Исполняемый ящик с Apache Maven (WordPress)
или исполняемый-jar -with-maven-example (GitHub)
Эти плюсы и минусы предоставляются Stephan .
<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}/${project.build.finalName}.lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
В этот момент jar
на самом деле выполняется с внешними элементами classpath.
$ java -jar target/${project.build.finalName}.jar
Файл jar
доступен только в каталоге sibling ...lib/
. Нам нужно сделать архивы для развертывания с каталогом и его содержимым.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>antrun-archive</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
<property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
<property name="tar.destfile" value="${final.name}.tar"/>
<zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" />
<tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
<gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
<bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
</target>
</configuration>
</execution>
</executions>
</plugin>
Теперь у вас есть target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
, каждый из которых содержит jar
и lib/*
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
У вас есть target/${project.bulid.finalName}-jar-with-dependencies.jar
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${fully.qualified.main.class}</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
У вас есть target/${project.build.finalName}-shaded.jar
.
<plugin>
<!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>${fully.qualified.main.class}</mainClass>
<attachToBuild>true</attachToBuild>
<!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
<!--classifier>onejar</classifier-->
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>${fully.qualified.main.class}</mainClass>
</configuration>
</execution>
</executions>
</plugin>
У вас есть target/${project.bulid.finalName}-spring-boot.jar
.
Используйте onejar plugin , чтобы создать его как один исполняемый файл jar, который упаковывает в него все банки зависимостей. Это решило мою проблему, которая была схожа с этим. Когда использовался плагин сборки, он распаковывал все баны для зависимостей в исходную папку и переупаковывал их как банку, он написал все аналогичные реализации, которые у меня были внутри моего кода, которые имели одинаковые имена классов. Здесь один из них - простое решение.
mvn clean compile assembly:single
. – Michael 31 May 2011 в 20:03<appendAssemblyId>false</appendAssemblyId>
вconfiguration
, чтобы избежать раздражающих «-jar-with-dependencies». суффикс в названии – maxivis 6 May 2015 в 19:22compile
, и вы ввернуты. – prayagupd 13 November 2016 в 01:44