Java 用maven构建可执行jar?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1814526/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Building executable jar with maven?
提问by RMorrisey
I am trying to generate an executable jar for a small home project called "logmanager" using maven, just like this:
我正在尝试使用 maven 为一个名为“logmanager”的小型家庭项目生成一个可执行的 jar,就像这样:
How can I create an executable JAR with dependencies using Maven?
I added the snippet shown there to the pom.xml, and ran mvn assembly:assembly. It generates two jar files in logmanager/target: logmanager-0.1.0.jar, and logmanager-0.1.0-jar-with-dependencies.jar. I get an error when I double-click on the first 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.
A slightly different error when I double-click the jar-with-dependencies.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
I copied and pasted the path and classname, and checked the spelling in the POM. My main class launches fine from an eclipse launch configuration. Can someone help me figure out why my jar file won't run? Also, why are there two jars to begin with? Let me know if you need more information.
我复制并粘贴了路径和类名,并检查了 POM 中的拼写。我的主类可以从 Eclipse 启动配置正常启动。有人可以帮我弄清楚为什么我的 jar 文件无法运行吗?另外,为什么有两个罐子开始?如果您需要更多信息,请与我们联系。
Here is the full pom.xml
, for reference:
这是完整的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>
采纳答案by Pascal Thivent
Actually, I think that the answer given in the questionyou mentioned is just wrong(UPDATE - 20101106:someone fixed it, thisanswer refers to the version preceding the edit) and this explains, at least partially, why you run into troubles.
实际上,我认为您提到的问题中给出的答案是错误的(更新 - 20101106:有人修复了它,此答案指的是编辑之前的版本),这至少部分解释了您遇到麻烦的原因。
It generates two jar files in logmanager/target: logmanager-0.1.0.jar, and logmanager-0.1.0-jar-with-dependencies.jar.
它在 logmanager/target 中生成两个 jar 文件:logmanager-0.1.0.jar 和 logmanager-0.1.0-jar-with-dependencies.jar。
The first one is the JAR of the logmanager module generated during the package
phase by jar:jar
(because the module has a packaging of type jar
). The second one is the assembly generated by assembly:assembly
and should contain the classes from the current module and its dependencies (if you used the descriptor jar-with-dependencies
).
第一个是由package
阶段生成的 logmanager 模块的 JAR jar:jar
(因为模块有一个类型为 的封装jar
)。第二个是由assembly:assembly
当前模块生成的程序集及其依赖项(如果您使用了描述符jar-with-dependencies
),并且应该包含这些类。
I get an error when I double-click on the first jar:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
双击第一个 jar 时出现错误:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
If you applied the suggested configuration of the link posted as reference, you configured the jar plugin to produce an executable artifact, something like this:
如果您应用了作为参考发布的链接的建议配置,则您将 jar 插件配置为生成可执行工件,如下所示:
<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>
So logmanager-0.1.0.jar
is indeed executable but 1. this is not what you want (because it doesn't have all dependencies) and 2. it doesn't contain com.gorkwobble.logmanager.LogManager
(this is what the error is saying, check the content of the jar).
所以logmanager-0.1.0.jar
确实是可执行的,但是 1. 这不是你想要的(因为它没有所有依赖项)和 2. 它不包含com.gorkwobble.logmanager.LogManager
(这是错误所说的,检查 jar 的内容)。
A slightly different error when I double-click the jar-with-dependencies.jar:
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.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
Again, if you configured the assembly plugin as suggested, you have something like this:
同样,如果你按照建议配置了程序集插件,你会有这样的东西:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
With this setup, logmanager-0.1.0-jar-with-dependencies.jar
contains the classes from the current module andits dependencies but, according to the error, its META-INF/MANIFEST.MF
doesn'tcontain a Main-Class
entry (its likely not the same MANIFEST.MF as in logmanager-0.1.0.jar). The jar is actually notexecutable, which again is not what you want.
有了这个设置,logmanager-0.1.0-jar-with-dependencies.jar
包含的类从当前模块和它的依赖,但根据错误,它META-INF/MANIFEST.MF
并不包含一个Main-Class
条目(其可能不一样MANIFEST.MF在日志管理-0.1.0.jar)。该 jar 实际上是不可执行的,这又不是您想要的。
So, my suggestion would be to remove the configuration
element from the maven-jar-plugin and to configure the maven-assembly-plugin like this:
因此,我的建议是configuration
从 maven-jar-plugin 中删除该元素并像这样配置 maven-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>
Of course, replace org.sample.App
with the class you want to have executed. Little bonus, I've bound assembly:single
to the package
phase so you don't have to run assembly:assembly
anymore. Just run mvn install
and the assembly will be produced during the standard build.
当然,替换org.sample.App
为您要执行的类。一点点奖励,我已经绑定assembly:single
到了这个package
阶段,所以你不必再跑assembly:assembly
了。只需运行即可mvn install
在标准构建期间生成组件。
So, please update your pom.xml with the configuration given above and run mvn clean install
. Then, cd into the target
directory and try again:
因此,请使用上面给出的配置更新您的 pom.xml 并运行mvn clean install
. 然后, cd 进入target
目录并重试:
java -jar logmanager-0.1.0-jar-with-dependencies.jar
If you get an error, please update your question with it and post the content of the META-INF/MANIFEST.MF
file and the relevant part of your pom.xml
(the plugins configuration parts). Also please post the result of:
如果您收到错误,请更新您的问题并发布META-INF/MANIFEST.MF
文件的内容和您的pom.xml
(插件配置部分)的相关部分。还请发布以下结果:
java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager
to demonstrate it's working fine on the command line (regardless of what eclipse is saying).
证明它在命令行上工作正常(不管 eclipse 说什么)。
EDIT: For Java 6, you need to configure the maven-compiler-plugin. Add this to your pom.xml:
编辑:对于 Java 6,您需要配置 maven-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>
回答by leonidv
If you don't want execute assembly goal on package, you can use next command:
如果不想在包上执行程序集目标,可以使用下一个命令:
mvn package assembly:single
Here packageis keyword.
这里包是关键字。
回答by mike
The answer of Pascal Thiventhelped me out, too.
Butif you manage your plugins within the <pluginManagement>
element, you have to define the assembly again outside of the plugin management, or else the dependencies are not packed in the jar if you run mvn install
.
Pascal Thivent的回答也帮助了我。
但是如果你在<pluginManagement>
元素内管理你的插件,你必须在插件管理之外再次定义程序集,否则如果你运行mvn install
.
<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>
回答by dolly doll
Right click the project and give maven build,maven clean,maven generate resource and maven install.The jar file will automatically generate.
右键项目,给出maven build、maven clean、maven generate resource和maven install。jar文件会自动生成。