0. 前言
在Maven库中,我们经常可以看到一个jar有jar、sources、javadoc多个子资源,如下图的junit 4.10。如果我们自己的Maven工程也想这样,该怎么办呢?
1. 准备工作
官方文档中,上面这种情况被称作Artifact Bundles,官方描述如下:Artifact Bundles就是指拥有相同GAV坐标(gourpId、artifactId、version)的一组组件。要想编译一个Bundles,你工程的POM文件,必须要包含以下元素。
<project>
<modelVersion></modelVersion>
<groupId></groupId>
<artifactId></artifactId>
<packaging></packaging>
<name></name>
<version></version>
<description></description>
<url></url>
<licenses></licenses>
<scm></scm>
<url></url>
<connection></connection>
</scm>
</project>
下面是一个最简单是POM.XML的示例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sonatype.sample</groupId>
<artifactId>sample-project</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>sample-project</name>
<description>A Sample Project for the Nexus Book</description>
<url>http://books.sonatype.com</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<scm>
<connection>
scm:git:git://github.com/sonatype/sample-project.git
</connection>
<url>http://github.com/sonatype/sample-project.git</url>
<developerConnection>
scm:git:git://github.com/sonatype-sample-project.git
</developerConnection>
</scm>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
注意,上面例子中<scm></scm>中的链接地址并不需要是自己的私人地址,直接把我这里的拷贝过去用就可以。
2. 编译
修改好pom.xml以后,就可以编译了,编译使用下面的命令。
mvn clean javadoc:jar source:jar repository:bundle-create
上面命令中的clean不是必须的,只是我的个人习惯。另外javadoc:jar是生成javadoc.jar,不加这一句就不会生成javadoc.jar;source:jar是生成sources.jar,同理,不加这一句就不会生成sources.jar;repository:bundle-create是生成bundle.jar,也就是同时包含javadoc.jar、sources.jar以及项目jar的一个压缩包。
编译时,如果一切正常,那么最后会出现一个这样的提示让你选择。这个选择是问你最后生成的bundle.jar不包含哪个组件,不包含谁就选几,如果你有多个组件不包含,就用逗号分隔。如果你用的是Nexus Pro,那么就要选0,我们这里讲解的是Nexus OSS,所以选哪个都没关系,反正最后用不上。
编译成功后的target文件夹是这样的:
打开bundle.jar,可以看到其内部包含了aa-1.0.0.jar、aa-1.0.0-javadoc.jar、aa-1.0.0-sources.jar三个组件,如下图:
3. 上传
注意:只有Nexus Pro才能直接上传bundle,我这里没有Nexus Pro,无法截图,如果你使用的是Nexus Pro,请参考官方文档,文档地址如下:http://books.sonatype.com/nexus-book/reference/staging-deployment.html#fig-staging-component-upload。
如果你和我一样,使用的是免费的Nexus OSS,那么请继续:
首先用有上传权限的用户登录Nexus,之后再选中相应的本地库,最后再将pom.xml以及编译好的jar、javadoc.jar、sources.jar分别加入到要上传的组件区,点击上传即可,如下图:
最后,切换回仓库界面,可以看到我们刚上传的组件
4. 参考文献
https://books.sonatype.com/nexus-book/reference/bundles.htmlhttp://books.sonatype.com/nexus-book/reference/staging-deployment.html#fig-staging-component-upload
https://support.sonatype.com/entries/22189106-How-can-I-programatically-upload-an-artifact-into-Nexus