用Maven 2构build一个可运行的jar

我对Maven的口头禅相对来说比较陌生,但是我正在尝试用Maven构build一个命令行可运行的jar。 我已经设置了我的依赖关系,但是当我运行mvn install并尝试运行jar时,发生了两件事情。 首先,找不到主类,这是可以纠正的。 当我纠正这个,我得到运行错误,说明类无法find。

Maven不会将我的依赖库封装在jar中,所以我无法将jar作为独立的应用程序运行。 我该如何纠正?

最简单的方法是使用maven-assembly-plugin和预定义的jar-with-dependencies描述符来创build一个程序集。 你还需要为这个超级jar子生成一个主类input的清单。 下面的代码展示了如何configuration程序集插件:

 <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 

如果您想要生成程序集作为您的构build的一部分,只需将assembly:single mojo绑定到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文件一起传递,并将其提交到Manifest的Class-Path头中 。

要走这条路线,你需要为maven-jar-plugin启用addClasspath属性( 这里logging )。

如果你真的想把所有的依赖包括在你的jar文件中,那么你可以使用Maven Assembly插件创build一个jar-with-dependencies

这是我为小型项目所做的。 大多数时候你不想要一个巨大的jar子。

构build: mvn clean依赖项:复制依赖包

执行( 在目标目录中 ): java -cp myjar.jar:./依赖项/ * com.something.MyClass

我同意Joachim Sauer,

不要使用jar-with-dependency,而应该像在你的pom.xml中那样configurationjar插件:

 <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> 

并使用此程序集configuration将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将被创build在eclipse的目标文件夹中,可以用作“java -jar Hello.jar”。 但要确保主类的名字是com.abc.HelloWorld.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> 

使用onejar插件: http ://onejar-maven-plugin.googlecode.com/svn/mavensite/usage.html

它会创build一个包含所有依赖关系的可运行jar文件。

Interesting Posts