在构建生命周期之外分发/使用maven项目的推荐做法

时间:2011-08-26 21:55:41

标签: maven jar maven-3

在很多情况下,我不确定最好处理maven项目的依赖关系。那是在执行一个包含mvn包结果的jar时。

我尝试过的事情

1)Maven-shade插件 对于某些用例(例如hadoop作业),我发现使用Maven shade插件与包步骤集成是很方便的(它构建了一个全包的uber-jar)。缺点是超级罐太大了。此外,我不能让maven阴影处理datanucleus依赖,因为它弄乱了一些东西。

2)将依赖项与jar一起分发。

//something like this
$ mvn package dependency:copy-dependencies
$ java -cp target/project.jar:target/dependency com.MyMainClass

生成一个包含所有依赖项和jar的目录。

我想做的是

3)只需能够在执行jar时分发jar并处理依赖项。由于mvn包将pom放在jar文件夹中,所有信息都在那里吗? 。现在,我希望如果有一行命令能够运行这个jar,请求maven管理依赖项。如果有人知道这样的东西是否可以用作hadoop工作,那就更棒了。

1 个答案:

答案 0 :(得分:2)

我认为在你的观点3中没有问题的解决方案。

我的三个选项,在所有情况下,您都可以使用简单的java -jar target/project.jar运行应用程序。不需要更多。

1。具有jar-with-dependencies描述符的Maven Assembly插件

(这里错过了jar配置中的清单)

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.2</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

2。 Maven依赖插件

Maven依赖插件,正确的jar配置(classpath)和maven程序集自定义描述符,用于打包在一起。

(如果您的项目没有使用快照依赖项,则可以简化此操作)

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>your.package.MainApp</mainClass>
                <packageName>your.package</packageName>
                <classpathLayoutType>custom</classpathLayoutType>
                <customClasspathLayout>lib/$${artifact.artifactId}.$${artifact.extension}/customClasspathLayout>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>true</overWriteReleases>
                <overWriteSnapshots>true</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
                <excludeScope>test</excludeScope>
                <includeScope>compile</includeScope>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

3。 Maven One Jar

<plugin>
    <groupId>org.dstovall</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.4.4</version>
    <executions>
        <execution>
            <configuration>
                <attachToBuild>true</attachToBuild>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>