用maven构build可执行文件jar?

我正在尝试使用maven为一个名为“logmanager”的小型家庭项目生成一个可执行的jar文件,就像这样:

我怎样才能创build一个使用Maven的依赖关系的可执行JAR?

我将那里显示的片段添加到pom.xml,然后运行mvn assembly:assembly。 它在logmanager / target中生成两个jar文件:logmanager-0.1.0.jar和logmanager-0.1.0-jar -with-dependencies.jar。 双击第一个jar时出现错误:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

当我双击jar-with-dependencies.jar时,出现一个稍微不同的错误:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

我复制并粘贴了path和类名,并检查了POM中的拼写。 我的主类从Eclipse启动configuration启动罚款。 有人可以帮我弄清楚为什么我的jar文件不能运行? 另外,为什么有两个jar子开始呢? 如果您需要更多信息,请与我们联系。

这里是完整的pom.xml ,供参考:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gorkwobble</groupId> <artifactId>logmanager</artifactId> <name>LogManager</name> <version>0.1.0</version> <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <!-- nothing here --> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-4</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.gorkwobble.logmanager.LogManager</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <dependencies> <!-- commons-lang --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> <!-- Quartz scheduler --> <dependency> <groupId>opensymphony</groupId> <artifactId>quartz</artifactId> <version>1.6.3</version> </dependency> <!-- Quartz 1.6.0 depends on commons collections --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <!-- Quartz 1.6.0 depends on commons logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> </dependency> <!-- Quartz 1.6.0 requires JTA in non J2EE environments --> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> <scope>runtime</scope> </dependency> <!-- junitx test assertions --> <dependency> <groupId>junit-addons</groupId> <artifactId>junit-addons</artifactId> <version>1.4</version> <scope>test</scope> </dependency> <!-- junit dependency; FIXME: make this a separate POM --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1</version> </dependency> </dependencies> <dependencyManagement> </dependencyManagement> </project> 

其实,我认为你提到的问题的答案是错误的更新 – 20101106:有人修正了这个问题, 这个答案是指编辑前的版本 ),这至less部分解释了为什么你会遇到麻烦。


它在logmanager / target中生成两个jar文件:logmanager-0.1.0.jar和logmanager-0.1.0-jar -with-dependencies.jar。

第一个是在package阶段通过jar:jar (因为模块具有jartypes的包装)生成的logmanager模块的JAR。 第二个是由assembly:assembly assembly生成的assembly:assembly并且应该包含当前模块及其依赖关系(如果使用描述符jar-with-dependencies )中的类。

双击第一个jar时出现错误:

 Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

如果您应用了作为参考发布的链接的build议configuration,则您将jar插件configuration为生成可执行的工件,如下所示:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.gorkwobble.logmanager.LogManager</mainClass> </manifest> </archive> </configuration> </plugin> 

所以logmanager-0.1.0.jar确实是可执行的,但是1.这不是你想要的(因为它没有所有的依赖),2.它不包含com.gorkwobble.logmanager.LogManager (这是什么错误是说,检查jar的内容)。

当我双击jar-with-dependencies.jar时,出现一个稍微不同的错误:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

同样,如果按照build议configuration程序集插件,则可以使用以下方法:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> 

通过这个设置, logmanager-0.1.0-jar-with-dependencies.jar包含了当前模块及其依赖的类,但是根据错误,它的META-INF/MANIFEST.MF 包含Main-Class (可能与logmanager-0.1.0.jar中的MANIFEST.MF不一样)。 该jar实际上是不可执行的,这又不是你想要的。


所以,我的build议是从maven-jar-plugin中移除configuration元素,并像这样configurationmaven-assembly-plugin:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <!-- nothing here --> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-4</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>org.sample.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> 

当然,将org.sample.Appreplace为您想要执行的类。 一点奖金,我已经绑定assembly:singlepackage阶段,所以你不必再运行assembly:assembly 。 只需运行mvn install ,程序集将在标准版本中生成。

所以,请用上面给出的configuration更新您的pom.xml,然后运行mvn clean install 。 然后,cd进入target目录并重试:

 java -jar logmanager-0.1.0-jar-with-dependencies.jar 

如果您遇到错误,请更新您的问题并发布META-INF/MANIFEST.MF文件的内容以及您的pom.xml的相关部分(插件configuration部分)。 也请张贴结果:

 java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager 

来certificate它在命令行上工作正常(不pipe日食是怎么说的)。

编辑:对于Java 6,你需要configurationmaven-compiler-plugin。 将此添加到您的pom.xml中:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> 

Pascal Thivent的回答帮了我。 但是,如果在<pluginManagement>元素中pipe理插件,则必须在插件pipe理之外再次定义程序集,否则,如果运行mvn install ,则依赖项不会打包在jar中。

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>main.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> <plugins> <!-- did NOT work without this --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> </plugin> </plugins> </build> <dependencies> <!-- dependencies commented out to shorten example --> </dependencies> </project> 

如果你不想在包上执行程序集目标,你可以使用下一个命令:

 mvn package assembly:single 

这里package是关键字。

右键单击项目,然后给maven build,maven clean,maven generate resource和maven install。这个jar文件会自动生成。