Я относительно новичок в мантре Maven, но я пытаюсь создать запускаемый jar из командной строки с Maven. Я установил свои зависимости, но когда я запускаю mvn install
и пытаюсь запустить jar, происходят две вещи. Во-первых, основной класс не найден, что можно исправить. Когда я исправил это, при запуске я получаю сообщения об отсутствии классов.
Maven не упаковывает мои библиотеки зависимостей внутри jar, поэтому я не могу запустить jar как отдельное приложение. Как мне это исправить?
java
maven-2
build-process
executable-jar
Стефан Кендалл
источник
источник
Ответы:
Самый простой способ сделать это - создать сборку с использованием
maven-assembly-plugin
предопределенногоjar-with-dependencies
дескриптора и. Вам также нужно будет создать манифест с записью основного класса для этого uber jar. В приведенном ниже фрагменте показано, как настроить плагин сборки для этого:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
Затем, чтобы сгенерировать сборку, просто запустите:
mvn assembly:assembly
Если вы хотите сгенерировать сборку как часть вашей сборки, просто привяжите
assembly:single
mojo к фазе пакета:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
И просто запустите:
mvn package
источник
assembly:assembly
Цель осуждаетсяMaven не упаковывает ваши зависимости в ваш файл jar, потому что вы обычно не делаете этого с программами Java.
Вместо этого вы доставляете зависимости вместе с файлом баночки и указать их в в
Class-Path
заголовке манифеста .Чтобы пойти по этому пути, вам необходимо включить
addClasspath
свойство (задокументированное здесь ) дляmaven-jar-plugin
.Если вы действительно хотите включить все свои зависимости в файл jar, вы можете использовать плагин Maven Assembly для создания файла
jar-with-dependencies
.источник
Это то, что я бы сделал для небольших проектов. В большинстве случаев вам не нужна одна огромная банка.
для сборки: mvn clean dependency: copy-dependencies package
выполнить ( в целевом каталоге ): java -cp myjar.jar: ./ dependency / * com.something.MyClass
источник
Я согласен с Иоахимом Зауэром,
Вместо использования jar-with-dependency вы должны настроить плагин jar следующим образом в вашем pom.xml:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> <mainClass>[mainClassFullName]</mainClass> </manifest> <manifestEntries> <mode>development</mode> <url>${project.url}</url> <key>value</key> </manifestEntries> </archive> </configuration> </plugin>
И используйте эту конфигурацию сборки, чтобы добавить к вашей сборке зависимости jar:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>zip-with-jars</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>false</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> </dependencySets> </assembly>
источник
Просто добавьте приведенный ниже код в pom.xml и запустите как: maven: install. Баночка будет создана в целевой папке eclipse, которую можно использовать как «java -jar Hello.jar». но убедитесь, что имя основного класса указано com.abc.HelloWorld.java
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-shade-plugin</artifactid> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalname>HelloW</finalname> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestentries> <main-class>com.abc.HelloWorld.java</main-class> <build-number>1</build-number> </manifestentries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
источник