Как создать файл assembly.xml, который будет выполнять как jar с зависимостями (распаковывать все эти файлы jar), так и включать файл war из другого проекта (который не распакован).
Предполагается, что у вас есть структура проекта, аналогичная приведенной ниже (я предполагаю простую структуру, поскольку вы не упомянули об этом ничего конкретного):
.
├── pom.xml
└── src
├── main
│ ├── assembly
│ │ └── uberjar.xml
│ └── java
│ └── com
│ └── stackoverflow
│ └── App.java
└── test
└── java
└── com
└── stackoverflow
└── AppTest.java
Со следующим pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>Q3762049</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- this is the war we want to include in the assembly -->
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<!-- and below, the other dependencies -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/uberjar.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Как видите,
- Мы не будем здесь использовать предопределенный дескриптор
jar-with-dependencies
, мы собираемся использовать его в нашем собственном дескрипторе сборки.
- У нас объявлена зависимость от войны с областью действия
runtime
, поэтому мы сможем включить ее в сборку.
А теперь кастом uberjar.xml
:
<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>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<excludes>
<exclude>*:war</exclude>
</excludes>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>*:war</include>
</includes>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Это небольшой вариант дескриптора jar-with-dependencies
, который создаст банку:
- зависимости кроме войны, без упаковки
- война веб-приложения, не распакованная
- классы из самого проекта
Как показано ниже:
$ mvn clean package
[INFO] Scanning for projects...
...
$ cd target; jar xvf Q3762049-1.0-SNAPSHOT-uberjar.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
created: org/
created: org/apache/
created: org/apache/commons/
created: org/apache/commons/lang/
created: org/apache/commons/lang/builder/
created: org/apache/commons/lang/enum/
created: org/apache/commons/lang/enums/
created: org/apache/commons/lang/exception/
created: org/apache/commons/lang/math/
created: org/apache/commons/lang/mutable/
created: org/apache/commons/lang/text/
created: org/apache/commons/lang/time/
inflated: META-INF/LICENSE.txt
inflated: META-INF/NOTICE.txt
inflated: org/apache/commons/lang/ArrayUtils.class
...
created: META-INF/maven/
created: META-INF/maven/commons-lang/
created: META-INF/maven/commons-lang/commons-lang/
inflated: META-INF/maven/commons-lang/commons-lang/pom.xml
inflated: META-INF/maven/commons-lang/commons-lang/pom.properties
<b> inflated: my-webapp-1.0-SNAPSHOT.war</b>
created: com/
created: com/stackoverflow/
inflated: com/stackoverflow/App.class