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

Java 在运行时maven中找不到依赖项,java,maven-2,Java,Maven 2,我是maven的新手,对java有些陌生。我试过谷歌和相关的资源,但没有找到一个和我的情况相似的 现在,我有maven项目X和YX可以看作是一个带有一些实用程序的共享库,Y是一个简单的JFrame,打印了“hello world”并在X中调用静态方法 我在项目X上执行了一次“以maven安装方式运行”,我得到了一个“构建成功”。我将项目X作为依赖项添加到项目Y(使用Eclipse中的pom编辑器,浏览存储库并找到它)。我在项目Y上运行了一个“runasmaven包”,我得到了一个“buildsu

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

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

我在项目
X
上执行了一次“以
maven安装方式运行”
,我得到了一个
“构建成功”
。我将项目
X
作为依赖项添加到项目
Y
(使用Eclipse中的pom编辑器,浏览存储库并找到它)。我在项目
Y
上运行了一个“runas
maven包”
,我得到了一个
“buildsuccessful”
。在通过
java-jar
运行project
Y
或检查生成的jar时,project
X
到处缺失,我得到一个奇特的类notfound exception。Eclipse找到它,并且在源代码编辑器中没有编译错误

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

POM:


com.company.deployment.shared
com.company.deployment.shared
0.0.1-快照
编译

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

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


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

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

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

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

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

您可能也会发现这很有帮助


如果您的客户端无法像防火墙后那样从maven m2 repo实时下载依赖项,或者没有internet连接,那么您还需要使用打包依赖项来复制所有依赖项并组装依赖项

在project Y中生成的工件仅包含project Y中的生成结果,不包括其依赖项

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

例如,为project 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>

...
...

对于更复杂的用法。

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


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

如果我觉得这很难,请原谅,我来自.net世界,我的销售dpt向我出售了一个java项目。但出于某种原因,maven只检查依赖项是否存在,而不添加它们?感谢您提供关于可执行jar的提示,但是现在,所有依赖项仍然丢失。。。我如何将其打包,使我的客户能够使用它?我当然希望他们不需要这个命令行…?@Helfdane-它没有将依赖项放入您的JAR中的原因是,在大多数情况下,这不是正确的做法。在这种情况下,有各种各样的插件可以做到这一点。我们将对此进行研究,thanx将提供提示。
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"
<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>