我已经使用Maven来构建我的命令行应用程序。现在我要将它作为jar文件分发,我需要处理应用程序的依赖项。
我不想按照here所描述的那样在jar文件中包含所有依赖项。
我的应用程序将运行的环境有Maven。我希望Maven运行我的jar查看包中的文件META-INF/groupId/artifactId/pom.xml
,以便它知道依赖项是什么,并可以在存储库中找到它们。
有什么想法吗?
答案 0 :(得分:6)
在jar中包含一个主类,1)将pom提取到临时文件,2)使用带有-f参数和目标dependency:resolve和{{3}的文件启动新的maven进程}
像这样:mvn -f /temp/tempfile.xml dependency:resolve dependency:build-classpath -DoutputFile=/temp/classpath.txt
然后3)读取新创建的类路径文件,4)使用新的类路径文件启动新的java进程
java -cp yourjar.jar;<created classpath>
您的pom.xml必须包含所有必需的存储库信息,当然
答案 1 :(得分:0)
我们可以使用maven-jar-plugin
代替原因,因为在命令行中使用java
命令复制粘贴时,生成的类路径无法容纳。
mvn -f /temp/tempfile.xml dependency:resolve dependency:build-classpath -DmdepoutputFile=/temp/classpath.txt
因此无法成功复制classpath.txt作为命令,
java -cp yourjar.jar;<created classpath>
我是spring-boot
申请,因此我有以下BOOT-INF/lib
行。对于您来说,如果是WEB-INF/lib
文件,则可以是.war
,如果基于lib/
构建项目,则可以是ant
。
<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>BOOT-INF/lib/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
BOOT-INF
,由spring-boot:repackage
maven命令和使用插件提供,spring-boot-maven-plugin
我未包含在这里。
请在此处找到maven-jar-plugin
配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.pakage.SampleApplication</mainClass>
<!--<classpathPrefix>lib/</classpathPrefix>-->
<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>BOOT-INF/lib/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
<!--<customClasspathLayout>BOOT-INF/lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>-->
</manifest>
</archive>
</configuration>
</plugin>