目前绝大多数项目用apache maven做java应用依赖管理,当我们缺少某个jar包,只需要在maven中央仓库查找它的GAV坐标,然后在POM文件中声明,在构建时这个jar包会被下载。但有时候也会遇到一个情况,别人给你一个jar包,这个jar包在中央仓库、公司私有仓库和本地仓库都不存在。既然这个jar包都不在仓库里面,那还怎么使用maven管理依赖呢?
方案一
在根目录下创建一个libs目录,并把这个别人给你的jar包放到其中,然后在POM文件中像下面这样声明依赖。
<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中配置插件:
<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配置。按照实际情况修改下面命令的参数,并在命令行执行:
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包上传到公司中央仓库。
<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
中配置好公司的中央仓库。
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文件进行导入,执行命令:
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 | |
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 |