Как я могу использовать Maven для создания jar с необходимыми библиотеками в подпапке (например, Eclipse)

#maven #jar #maven-assembly-plugin

#maven #jar #maven-assembly-plugin

Вопрос:

В Eclipse вы можете создать jar проекта с его требуемыми зависимостями в соседней подпапке, выполнив …

  1. Экспорт-> Java-> Исполняемый файл JAR

  2. Выберите опцию обработки библиотеки: скопируйте необходимые библиотеки в подпапку рядом с сгенерированным 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!