在运行时maven中找不到依赖项

时间:2011-07-08 07:56:29

标签: java maven-2

我是maven的新手,对java来说有点新鲜。尝试谷歌和相关的来源,但我没有找到一个类似我的情况。

现在,我有maven项目XYX可以看作是包含一些实用程序的共享库,Y是一个简单的JFrame,其中打印了"hello world",并在X中调用了静态方法

我在项目maven install上执行“X运行”,得到"build successful"。我将项目X添加为项目Y中的依赖项(使用Eclipse中的pom-editor,浏览存储库并找到它)。我在项目maven package上“运行Y”,得到"build successful"。在通过Y运行项目java -jar或检查生成的jar后,项目X在任何地方都丢失了,我得到了一个未找到奇特类的异常。 Eclipse找到它并且源编辑器中没有编译错误。

为什么它只在Eclipse编辑器中工作而不是jar?

POM:

    <dependency>
        <groupId>com.company.deployment.shared</groupId>
        <artifactId>com.company.deployment.shared</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

6 个答案:

答案 0 :(得分:7)

Maven不会为您生成合并的JAR文件。 Eclipse正在做的是查看Maven配置,并在运行时为您的类路径添加所有必需的类/ jar。

如果要从命令行运行程序,则需要手动将所有JAR添加到类路径中。

或者,您可以运行应该设置所有依赖项的程序directly from Maven。根据您的要求,有许多选项,例如,如果它是由最终用户运行的应用程序,您可以查看one-jar Maven plugin

答案 1 :(得分:1)

我建议您查看Maven shade plugin。这会生成一个“超级jar”,包含您的项目及其所有依赖项。它还可以执行其他操作,例如设置入口点类以使JAR文件成为可执行JAR。

答案 2 :(得分:1)

您还可以找到exec-maven-plugin有用的

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"

如果您的客户端无法像防火墙或没有互联网连接那样即时从maven m2 repo下载依赖项,那么您还需要使用maven-dependency-plugin打包依赖项以复制所有依赖项和maven-assembly-plugin汇编依赖

答案 3 :(得分:0)

它不起作用,因为Maven在构建项目时解析了依赖项,但没有将所有依赖项神奇地放在jar中。您应该在类路径中运行具有所有依赖项的应用程序:

java -classpath X.jar;Y.jar com.foo.bar.Main

或者您必须自定义maven jar插件才能创建可执行jar,如here所述。您还可以使用maven assemby插件将所有Y项目的依赖项复制到生成的Y.jar旁边的目标目录。

答案 4 :(得分:0)

项目Y中生成的工件仅包含项目Y中的构建结果,不包括其依赖项。

如果你想在Y中构建一个可以直接执行的JAR,你可以考虑使用程序集插件。

例如,为项目Y构建超级jar的最简单方法:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-all-in-one-jar</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
            ...
</project>

除了普通的工件外,还将创建一个包含来自依赖项的类等的程序集,这些程序适合由java -jar执行

访问http://maven.apache.org/plugins/maven-assembly-plugin/以获得更复杂的用法。

答案 5 :(得分:0)

Phil Sacre已经很好地解释了基本问题(基本上没有关于在Y.jar中嵌入X.jar的位置的信息)。

此外,您还可以查看appassembler-maven-plugin(例如,可以为已经具有正确类路径集的Y项目生成启动脚本)和/或exec-maven-plugin(可以用于例如使用maven直接使用正确的类路径启动Y.