Здание выполнимого jar с помощью Maven 2
Я относительно новичок в мантре Maven, но я пытаюсь построить запускаемую из командной строки банку с Maven. Я настроил свои зависимости, но когда я запускаю mvn install
и попытка запустить банку, происходят две вещи. Во-первых, не найден основной класс, который можно исправить. Когда я исправил это, я получаю ошибки при запуске, заявляя, что классы не могут быть найдены.
Maven не упаковывает мои библиотеки зависимостей внутри jar, поэтому я не могу запустить jar как автономное приложение. Как я могу это исправить?
5 ответов:
самый простой способ сделать это - создать сборку с помощью
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
Моджо к пакету фаза:<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
Maven не упаковывает ваши зависимости внутри вашего файла jar, потому что вы обычно не делаете этого с программами Java.
вместо этого вы доставляете зависимости вместе с вашим файлом jar и упоминаете их в the
Class-Path
заголовок Манифеста.чтобы пройти этот маршрут, вам нужно будет включить
addClasspath
собственность (документально здесь) дляmaven-jar-plugin
.если вы действительно хотите включить все ваши зависимости в вашем файле jar, затем вы можете использовать плагин сборки Maven для создания
jar-with-dependencies
.
Это то, что я бы сделал для небольших проектов. Большую часть времени вы не хотите одну огромную банку.
построить: mvn clean dependency: copy-dependencies package
выполнить (в целевой реж): java-cp myjar.сосуд.:/ dependency / * com.что-то.MyClass
Я согласен с Йоахимом Зауэром,
вместо использования jar-с-зависимостью вы должны настроить плагин 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 . Jar будет создан в целевой папке eclipse, которую можно использовать как "java-jar Hello.сосуд. " но убедитесь, что имя основного класса задано com.азбука.Адский мир.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>