我是maven的新手,对java有些陌生。尝试了谷歌和相关的来源,但我没有找到一个类似我的情况。
现在,我有一个专业的项目X
和Y
。X
可以看作是一个带有一些实用程序的共享库,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(。