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



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

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

我在项目X上做了一个"作为maven install运行",我得到了一个"build successful"。我在项目Y中添加了项目X作为依赖项(使用Eclipse中的pom编辑器,浏览存储库并定位它(。我在项目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>

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

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

或者,您可以直接从Maven运行程序,Maven应该设置您的所有依赖项。根据你想做什么,有很多选项,也就是说,如果它是一个由最终用户运行的应用程序,你可以查看一个jar Maven插件。

我建议您看看Maven shade插件。这将生成一个"超级罐子",其中包含您的项目及其所有依赖项。它还可以做其他事情,比如设置入口点类,使JAR文件成为可执行的JAR。

您可能还发现exec-maven插件有助于

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依赖插件来复制所有依赖项,使用maven组装插件来组装依赖项

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

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

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

项目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>

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

访问http://maven.apache.org/plugins/maven-assembly-plugin/用于更复杂的用途。

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

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

最新更新