我希望Maven将项目与其运行时依赖项打包在一起。我希望它使用以下清单创建一个JAR文件:
.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....
并创建以下目录结构:
target
|-- ....
|-- my-project.jar
|-- lib
|-- dependency1.jar
|-- dependency2.jar
意思是,我希望主JAR排除任何依赖项,并且我希望所有传递依赖项都被复制到“lib”子目录中。有什么想法吗?
答案 0 :(得分:63)
我希望Maven打包一个运行时依赖项目。
这部分不清楚(这不完全是你刚才所描述的)。我的回答涵盖了你所描述的内容。
我希望它使用以下清单(...)
创建一个JAR文件
配置Maven Jar Plugin以执行此操作(或更确切地说,Maven Archiver):
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.acme.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
<dependencies>
<dependency>
<groupId>dependency1</groupId>
<artifactId>dependency1</artifactId>
<version>X.Y</version>
</dependency>
<dependency>
<groupId>dependency2</groupId>
<artifactId>dependency2</artifactId>
<version>W.Z</version>
</dependency>
</dependencies>
...
</project>
这将产生一个MANIFEST.MF,其中包含以下条目:
...
Main-Class: fully.qualified.MainClass
Class-Path: lib/dependency1-X.Y.jar lib/dependency2-W.Z.jar
...
并创建以下目录结构(...)
使用Maven Dependency Plugin和dependency:copy-dependencies
目标是可行的。来自文档:
dependency:copy-dependencies
获取项目直接依赖项列表和可选的传递依赖项,并将它们复制到指定位置,根据需要剥离版本。也可以从命令行运行此目标。
您可以在package
阶段绑定它:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
答案 1 :(得分:4)
在pom.xml中添加以下插件。检查mainClass,classpathPrefix,addClasspath标记的值。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>org.apache.camel.spring.Main</mainClass>
<classpathPrefix>lib/</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/assembly/some-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
在src / assembly下创建some-assembly.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>distribution</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<scope>runtime</scope>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
注意useProjectArtifact标志为false,unpack标志为false。如果不需要zip文件中的根文件夹,那么可以使includeBaseDirectory为false。
这将创建name-version-distribution.zip文件。在zip文件里面,会有文件夹名称 - 版本。在此文件夹中,将包含包含所有依赖项jar的可执行jar和lib文件夹。检查可执行jar的manifest.MF文件。它包含主类和类路径信息。
答案 2 :(得分:0)
您可以使用maven jar插件,看一下这个页面: http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html