2012-03-28 80 views
4

嘿所以我一直在研究一个项目,我希望能够从命令行作为可执行jar运行。我已经能够使用Mavens assembly:single命令创建具有依赖关系的jar。我的pom看起来像这样。运行带有依赖项的可执行jar的问题

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>org.openmetadata.main.OmadUpdate</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

构建成功,并创建罐子omad更新-0.0.1-SNAPSHOT-JAR-与-dependencies.jar。我去我的项目目标文件夹中的命令行,然后键入

java -jar omad-update-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

我也曾尝试

java -cp omad-update-0.0.1-SNAPSHOT-jar-with-dependencies.jar org.openmetadata.main.OmadUpdate 

不幸的是,我给一个java.lang.NoClassDefFoundError每种情况:组织/ openmetadata /主/ OmadUpdate。我很困惑,因为我知道我的主类是在包org.openmetadata.main中,但它没有找到。我觉得这特别令人困惑,因为在我的朋友中,我将这个班级指定为我的班级。我已经尝试将主类的名称更改为src.main.java.org.openmetadata.main.OmadUpdate,并简单地更改OmadUpdate,但似乎都没有效果。感谢您提前提供任何帮助。

回答

2

我在上面的清单中看不到Class-Path条目,但是很长的文件名会提到依赖关系。如果程序依赖于此jar文件中的jar,则必须在Class-Path部分中列举它们。有关更多详细信息,请参阅Adding Classes to the JAR File's Classpath

+0

但根据此页[链接](http://maven.apache.org/plugins/maven-assembly-plugin/usage.html#aResources)它似乎没有,我必须指定一个类路径,它似乎是它会根据需要简单地打包Maven依赖项。尽管如此,我认为我可能会犯错。 – decal 2012-03-28 20:23:02

+0

打开您的jar文件并在META-INF目录中查找MANIFEST.MF文件。是否指定了类路径? – Mike 2012-03-28 20:25:37

+1

好吧,我在Mavens [网站](http://maven.apache.org/shared/maven-archiver/examples/classpath.html#aMake)上发现,将 true添加到我的pom.xml应该照顾classpath,但是当我尝试运行可执行jar时,仍然遇到我的Main类无法找到的问题。 – decal 2012-03-30 14:43:59

0

另一种选择可能是使用onejar-maven-plugin。不幸的是,usage页面有点缺乏,但是插件在正确配置时可以做到这一点。

0

我终于可以通过将下面的代码添加到我的pom中来获得此功能。

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>org.openmetadata.omadupdate.OmadUpdate</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
      <executions> 
       <execution> 
       <id>make-assembly</id> <!-- this is used for inheritance merges --> 
       <phase>package</phase> <!-- bind to the packaging phase --> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

没有与它的孩子只有Maven依赖将加入广口瓶中,并从项目本身将不会添加类沿POM处决标签。

相关问题