用Maven管理第三方jar包依赖

目前绝大多数项目用apache maven做java应用依赖管理,当我们缺少某个jar包,只需要在maven中央仓库查找它的GAV坐标,然后在POM文件中声明,在构建时这个jar包会被下载。但有时候也会遇到一个情况,别人给你一个jar包,这个jar包在中央仓库、公司私有仓库和本地仓库都不存在。既然这个jar包都不在仓库里面,那还怎么使用maven管理依赖呢?

方案一

在根目录下创建一个libs目录,并把这个别人给你的jar包放到其中,然后在POM文件中像下面这样声明依赖。

1
2
3
4
5
6
7
<dependency>
<groupId>com.tianmingxing.app</groupId>
<artifactId>web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/sdk.jar</systemPath>
</dependency>

这个jar包也可以放在本地其它位置,在<systemPath>元素中配置即可。

方案二

如果遇到其他同事也需要在自己本地构建项目的情况,那上面的这种方式就比较繁琐了,你必须把这个外部jar包提前发给他,这使得jar包共享变得不便利。试想如果能把这个jar包导入到本地和远程仓库,那不就可以像正常包那样声明依赖关系,从而解决包共享的问题了吗?

导入到本地仓库

我们需要借助maven-install-plugin插件来导入jar包到本地仓库,在项目POM中配置插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
</build>
...
</project>

Reimport Maven配置。按照实际情况修改下面命令的参数,并在命令行执行:

1
2
3
4
5
6
7
mvn install:install-file \
-Dfile=<path-to-file> \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<packaging> \
-DgeneratePom=true

如果这个jar包有pom文件,则可以使用以下命令进行安装:mvn install:install-file -Dfile=<path-to-file> -DpomFile=<path-to-pomfile>

另外,如果这个jar包正好就是由apache maven所构建出来的,也就是在jar解压出来之后,在META-INF目录下存在maven/.../pom.xml文件,那可以执行命令完成导入:mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=<path-to-file>

导入到远程仓库

上面导入到本地仓库只有自己可以下载到,如果想让同公司的其他同事也依赖到,还需要把这个第三方jar包上传到公司中央仓库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0-M1</version>
</plugin>
...
</plugins>
</build>
...
</project>

我们借助maven-deploy-plugin插件完成jar包的上传,注意你要提前在settings.xml中配置好公司的中央仓库。

1
2
3
4
5
6
7
mvn deploy:deploy-file -DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<type-of-packaging> \
-Dfile=<path-to-file> \
-DrepositoryId=<id-to-map-on-server-section-of-settings.xml> \
-Durl=<url-of-the-repository-to-deploy>

默认情况下插件会自动生成一个通用的POM文件,如果你要禁用掉这个功能,可以添加选项:-DgeneratePom=false

当这个jar包已经有POM文件时,可以使用它自己的POM文件进行导入,执行命令:

1
2
3
4
mvn deploy:deploy-file -DpomFile=<path-to-pom> \
-Dfile=<path-to-file> \
-DrepositoryId=<id-to-map-on-server-section-of-settings.xml> \
-Durl=<url-of-the-repository-to-deploy>

注意:repositoryId属性的值是你提前在settings.xml文件中配置的公司中央仓库ID。

其它

由于许可证和命名规则的问题,导致maven无法将sun的一些jar包纳入中央仓库,但你仍然可以在POM中添加SUN依赖,maven中央仓库存储了这些jar包的元数据以检索。

Product artifact Group ID Artifact ID
Java Activation Framework javax.activation activation
J2EE javax.j2ee j2ee
Java Data Object (JDO) javax.jdo jdo
Java Message Service (JMS) javax.jms jms
JavaMail javax.mail mail
Java Persistence API (JPA) / EJB 3 javax.persistence persistence-api
J2EE Connector Architecture javax.resource connector
J2EE Connector Architecture API javax.resource connector-api
Java Authentication and Authorization Service (JAAS) javax.security jaas
Java Authorization Contract for Containers javax.security jacc
Servlet API javax.servlet servlet-api
Servlet JavaServer Pages (JSP) javax.servlet jsp-api
Servlet JavaServer Pages Standard Tag Library (JSTL) javax.servlet jstl
JDBC 2.0 Optional Package javax.sql jdbc-stdext
Java Transaction API (JTA) javax.transaction jta
Java XML RPC javax.xml jaxrpc
Portlet javax.portlet portlet-api
Java Naming and Directory Interface (JNDI) javax.naming jndi