嘿所以我一直致力于一个项目,我希望能够从命令行作为可执行jar运行。我已经能够使用Mavens程序集创建具有依赖关系的jar:单个命令。我的pom看起来像这样。
<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>
构建成功并创建jar omad-update-0.0.1-SNAPSHOT-jar-with-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:org / openmetadata / main / OmadUpdate。我很困惑,因为我知道我的主类在org.openmetadata.main包中,但是找不到它。我发现这特别令人困惑,因为在我的pom中我将该类指定为我的主类。我已经尝试将主类的名称更改为src.main.java.org.openmetadata.main.OmadUpdate以及简单的OmadUpdate,但似乎都没有效果。在此先感谢您的帮助。
答案 0 :(得分:2)
我在上面的清单中没有看到Class-Path
条目,但是您的长文件名提到了依赖项。如果此jar文件中存在您的程序所依赖的jar,则必须在Class-Path
部分中枚举它们。有关详细信息,请参阅Adding Classes to the JAR File's Classpath。
答案 1 :(得分:0)
另一种选择可能是使用onejar-maven-plugin。不幸的是,usage页面有点稀缺,但插件在正确配置时会执行应该的操作。
答案 2 :(得分: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>
如果没有pom中的execution标签及其子节点,则只会将maven依赖项添加到jar中,并且不会添加项目本身的类。