运行带有依赖项的可执行jar的问题

时间:2012-03-28 18:27:46

标签: java maven command-line

嘿所以我一直致力于一个项目,我希望能够从命令行作为可执行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,但似乎都没有效果。在此先感谢您的帮助。

3 个答案:

答案 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中,并且不会添加项目本身的类。