#maven #jar #maven-assembly-plugin
#maven #jar #maven-assembly-plugin
Вопрос:
В Eclipse вы можете создать jar проекта с его требуемыми зависимостями в соседней подпапке, выполнив …
-
Экспорт-> Java-> Исполняемый файл JAR
-
Выберите опцию обработки библиотеки: скопируйте необходимые библиотеки в подпапку рядом с сгенерированным JAR
Есть ли способ сделать это с помощью плагина сборки Maven? Или есть другой плагин Maven, который был бы более подходящим для этой задачи?
Спасибо!
Ответ №1:
да, вы можете использовать плагин assembly. pom.xml:
<build>
<!-- final name set the jar name, if left it
will give defualt "${artifactId}-${version}" -->
<finalName>jar final name</finalName>
<sourceDirectory>src</sourceDirectory>
<!-- compiler plug in -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- assembly plugin -->
<!-- the assembly plugin is used to define your
final deploy output (jar, zip, dir, war, etc..)-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>assembly:package</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- The filename of the assembled distribution
file defualt ${project.build.finalName}-->
<finalName>${project.build.finalName}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<!-- A list of descriptor files path to generate from-->
<descriptors>
<descriptor>assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
<!-- jar plug in -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
<!-- to create a class path to your
dependecies you have to fill true in this field-->
<addClasspath>true</addClasspath>
<!-- if you put your dependencySet/outputDirectory
in the assembly file is in a specific folder (lib for example),
you need to add classpathPrefix-->
<classpathPrefix>lib/</classpathPrefix>
<!-- if you defined your dependencySet/outputFileNameMapping
in the assembly, instead of using the classpathPrefix,
you should use customClasspathLayout,
add the classpathPrefix at the begining of the
customClasspathLayout, and then add the pattern of the outputFileNameMapping,
NOTICE YOU NEED TO ADD '$' BEFOR OF EACH '$'.
supported only from version 2.3>-->
<!--<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>
lib/$${artifact.groupId}.$${artifact.artifactId}.$${artifact.extension}
</customClasspathLayout>-->
</manifest>
<manifestEntries>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
assembly.xml
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<!--the id will be add to the end of the distribution file -->
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>icons</directory>
<outputDirectory>icons</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
<fileSet>
<directory>conf</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
<files>
<!-- you need to create the bat file yourself -->
<file>
<source>batFileName.bat</source>
<filtered>true</filtered>
</file>
</files>
<dependencySets>
<dependencySet>
<!--define the outputDirectory of the dependencies,
NOTICE: if it's diffrent from '/' make sure to
change the classPath configuration for
the maven-jar-plugin in the pom-->
<outputDirectory>lib</outputDirectory>
<!-- maping the dependencies jar names.
NOTICE : if you used this definition, you need to use
customClasspathLayout classPath configuration
for the maven-jar-plugin in the pomg-->
<outputFileNameMapping>
${artifact.groupId}.${artifact.artifactId}.${artifact.extension}
</outputFileNameMapping>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</assembly>
Комментарии:
1. Было время, когда мы говорили другим использовать Maven, чтобы получить только определение и множество «условностей» желаемого результата. С помощью Ant (и других инструментов сборки) было бы проще простого … 🙁
2. ну, у maven есть несколько преимуществ, вам просто нужно их найти? решение об использовании maven в наших проектах не мое, поэтому мне нужно полюбить его и сделать все возможное
3. Спасибо за подробный ответ! С помощью нескольких настроек ваши образцы идеально подходят для нашего проекта. Это означает, что мы можем переместить сборку Java на сервер сборки. Это огромное улучшение стабильности нашего процесса и приложения. Еще раз, большое вам спасибо!
Ответ №2:
Это не совсем то, что вы хотите, но если вы используете war:war
цель (с -DfailOnMissingWebXml=false
), она поместит зависимости в WEB-INF/lib
каталог в вашей target
папке.
В качестве альтернативы ознакомьтесь с плагином зависимостей.
Комментарии:
1. Как вы сказали, это не совсем то, что мы ищем, но позволит нам автоматизировать сборку, так что 1! Если я не услышу решение для всех Maven в ближайшее время, вы обязательно получите ответ. Спасибо artbristol!