【问题标题】:dependency not found at runtime maven在运行时找不到依赖项 Maven
【发布时间】:2017-03-02 13:15:33
【问题描述】:

我是 maven 新手,对 java 有点陌生。尝试了谷歌和相关资源,但我没有找到与我的情况相似的。

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

我在项目X 上执行“以maven install 运行”,得到"build successful"。我将项目 X 添加为项目 Y 中的依赖项(使用 Eclipse 中的 pom-editor,浏览存储库并找到它)。我在项目Y 上执行“以maven package 运行”,得到"build successful"。在通过java -jar 运行项目Y 或检查生成的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>

【问题讨论】:

    标签: java maven-2


    【解决方案1】:

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

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

    或者,您可以运行您的程序directly from Maven,它应该设置您的所有依赖项。有许多选项取决于您想要做什么,即如果它是一个旨在由最终用户运行的应用程序,您可以查看one-jar Maven plugin

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 会看一下,谢谢提示。
      【解决方案3】:

      您可能还会发现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 即时下载依赖项,例如在防火墙后或没有 Internet 连接,那么您还需要使用 maven-dependency-plugin 打包依赖项以复制所有依赖项并使用 maven-assembly-plugin 以组装依赖项

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 如果我觉得这很难,请原谅我,我来自 .net 世界,我的销售 dpt 卖给我一个 java 项目来做。但是由于某种原因,maven 只检查依赖项是否存在而不添加它们?感谢您提供有关可执行 jar 的提示,但是现在,所有依赖项仍然缺失...如何以客户可以使用的方式打包它?我当然希望他们不需要命令行...?
        • @Helfdane - 它没有将依赖项放入您的 JAR 的原因是在大多数情况下这不是正确的做法。对于这种情况,有多种插件可以做到这一点。
        【解决方案5】:

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

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

        例如,为项目 Y 构建 uber-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>
        

        除了普通的artifact之外,还会创建一个包含依赖类等的程序集,适合java -jar执行

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

        【讨论】:

          【解决方案6】:

          Phil Sacre 已经很好地解释了基本问题(基本上没有关于在哪里可以找到嵌入在您的 Y.jar 中的 X.jar 的信息)。

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

          【讨论】:

            猜你喜欢
            • 2018-07-13
            • 1970-01-01
            • 2016-10-01
            • 2020-04-18
            • 2020-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多