2010-01-07 38 views
77

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

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

+0

您可以使用IDE像Netbenas – SjB 2010-01-07 16:58:36

+7

@SjB行家:和奇迹般地解决了这个问题?我不这么认为。 – 2010-01-07 17:05:47

+1

究竟是什么确切的重复? – 2010-01-07 17:43:18

回答

105

最简单的方法是使用maven-assembly-plugin和预定义的jar-with-dependencies描述符创建程序集。您还需要为这个超级罐子生成一个主类输入的清单。下面的片段展示了如何配置组件,插件可以这样做:

<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 

如果你想生成组件作为构建的一部分,只需将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 
+1

Maven-shade-plugin的工作原理也是类似的,专门用于此目的。 – 2010-01-07 20:46:04

+4

这对于春季以及期望类路径中具有相同名称的多个资源的其他库不起作用。在Spring的情况下,META-INF \ spring.schemas包含在几个jar(bean,jdbc等)中,用于为XML解析器配置XML名称空间支持。如果你尝试'jar-with-dependencies',pasing application-context.xml在运行时会失败,例如“org.xml.sax.SAXParseException:cvc-elt.1:找不到元素'beans'的声明。 – 2010-03-04 10:37:18

+0

@David Maven不会解决Java的“限制”。只需在这种情况下打包你的应用程序(即不在uberjar中)。 – 2010-03-04 15:55:42

25

Maven不会将您的依赖项打包到您的jar文件中,因为您通常不会在Java程序中执行此操作。

相反,您将依赖关系与jar文件一起提交并在the Class-Path header of the Manifest中提及它们。

要走这条路线,您需要为maven-jar-plugin启用addClasspath属性(记录here)。

如果您确实想将所有依赖包括在jar文件中,那么您可以使用Maven Assembly插件创建jar-with-dependencies

+4

+1我很难找到有关如何编译java程序*的信息并分发,特别是与Maven。 – 2012-02-06 17:30:27

6

我与约阿希姆·绍尔同意,

而不是使用JAR-有依赖性,你应该配置Jar插件一样,在你的pom.xml的:

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

,并使用该组件配置添加瓶子依赖关系给你汇编:

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

这是我会为小项目做什么。大多数时候你不想要一个巨大的罐子。

构建: MVN清洁依赖性:复制依赖性包

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

+0

+ 1为简单无配置no-pom修改解决方案。 – 2014-09-10 08:50:12

+0

太棒了!我将它保存在我的Makefile中,与pom.xml保存在同一个目录中。建立:\ n mvn ....(你说的) – Roboprog 2015-01-20 18:46:30

+0

谢谢。搜索互联网超过2小时后,发现这个非常有用的答案.... – Shekhar 2015-08-07 10:35:36

2

只需将下面的代码添加到pom.xml中,然后运行为:maven:install。该jar将在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> 
相关问题