我是maven的新手,对java来说有点新鲜。尝试谷歌和相关的来源,但我没有找到一个类似我的情况。
现在,我有maven项目X
和Y
。 X
可以看作是包含一些实用程序的共享库,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>
答案 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.