Maven:在运行命令行应用程序时使用存储库中的依赖项?

时间:2010-05-31 12:09:34

标签: maven-2

我已经使用Maven来构建我的命令行应用程序。现在我要将它作为jar文件分发,我需要处理应用程序的依赖项。

我不想按照here所描述的那样在jar文件中包含所有依赖项。

我的应用程序将运行的环境有Maven。我希望Maven运行我的jar查看包中的文件META-INF/groupId/artifactId/pom.xml,以便它知道依赖项是什么,并可以在存储库中找到它们。

有什么想法吗?

2 个答案:

答案 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>