如何使用外部依赖?
例子中有可能已经有dependencies元素了。实际上你会随时使用到外部的依赖资源,这边我们会谈论下他们是如何工作的。更详细的介绍请参考我们的依赖机制介绍。
pom文件的dependencies 片段中列出了所有的项目依赖,包括编译,运行,测试等用到的。目前我们的项目只依赖JUnit ,其他资源相关信息拿掉之后如下:
<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.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
对于任意一个外部依赖你需要定义如下四种事情: groupId, artifactId, version, 和scope。 groupId, artifactId, version这三个就按pom文件给定的定义即可,scope 标示你的工程运行此依赖的环境,值的形式如下:compile, test, 和runtime。其他关于依赖的信息请参考项目描述参考。更多关于依赖机制相关信息请参看依赖机制介绍。
maven构建的时候会获取依赖的相关信息,那么maven是从那获取的呢?maven首先会从本地资源库中获取资源(~/.m2/repository为本地资源库),首先把我们自己的jar放置到本地资源库上。一旦我们放进去了,其他的工程就可以依赖使用他也就是在pom文件中添加依赖:
<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"> <groupId>com.mycompany.app</groupId> <artifactId>my-other-app</artifactId> ... <dependencies> ... <dependency> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project>
那么依赖jar从哪来?他们是如何进入我们本地资源库的?当工程依赖了一个本地资源库不存在的jar的时候,maven就会从远程资源库上下载到本地资源库中去。有可能你注意到了,当你第一次编译工程的时候maven下载了很多东西(下载的这些东西就是构建项目的所有依赖)。默认远程资源库地址为: http://repo.maven.apache.org/maven2/,如果贵公司有自己的资源库的话那么你可以替换成自己的远程资源库,或者添加成自己的远程资源库。更多信息请参考资源库介绍。
让我们在我们的项目中添加依赖,我们需要记录一些日志那么我们就需要log4j这个依赖。首先我们应该知道log4j的groupId, artifactId和version。我们可以在ibiblio 中获取,或者通过谷歌site:www.ibiblio.org maven2 log4j搜索到 。结果展示目录为 /maven2/log4j/log4j (or /pub/packages/maven2/log4j/log4j)这个目录中有一个maven-metadata.xml. 文件里面记录了如下信息:
<metadata> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.1.3</version> <versioning> <versions> <version>1.1.3</version> <version>1.2.4</version> <version>1.2.5</version> <version>1.2.6</version> <version>1.2.7</version> <version>1.2.8</version> <version>1.2.11</version> <version>1.2.9</version> <version>1.2.12</version> </versions> </versioning> </metadata>
通过上述文件我们可以知道groupId 和artifactId都是log4j,同时也有很多可供选择的版本。现在我们就用最新的1.2.12 版本,在maven-metadata.xm文件旁边有针对版本的lib目录,每个里面我们可以精确的查找到jar,比如 log4j-1.2.12.jar。每个lib里都有一个pom文件和maven-metadata.xml,同时都有一个md5文件,这个里面包括对jar文件的一个md5值,你可以基于这个做文件校验,看是否你所需要的,那么现在我们就把这个依赖加入我们的pom文件:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
现在当你编译工程的时候(mvn compile),你可以看到maven从资源库上下载依赖的log4j jar文件。
如何发布jar到远程资源库上?
把jar发布到外部资源库你需要在pom中配置资源库地址,以及在settings.xml.配置链接认证信息。
此处我们利用scp和username/password来做例子
<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.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.codehaus.plexus</groupId> <artifactId>plexus-utils</artifactId> <version>1.0.4</version> </dependency> </dependencies> <build> <filters> <filter>src/main/filters/filters.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <!-- | | | --> <distributionManagement> <repository> <id>mycompany-repository</id> <name>MyCompany Repository</name> <url>scp://repository.mycompany.com/repository/maven2</url> </repository> </distributionManagement> </project>
对应的setting文件:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <servers> <server> <id>mycompany-repository</id> <username>jvanzyl</username> <!-- Default value is ~/.ssh/id_dsa --> <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa) <passphrase>my_key_passphrase</passphrase> </server> </servers> ... </settings>
注意:如果你链接一个开发的ssh服务器,他的sshd_confing配置中PasswordAuthentication应该设置成no,那么你就不得不输入 username/password去做认证(你可以通过ssh客户端登陆)。那么你可以基于public key 来做认证。
需要注意的是如果你在settings.xml中使用了密码认证那么更多信息请参考密码加密技术.