More Related Content
Similar to Maven私服安装,Maven使用教程 (20)
Maven私服安装,Maven使用教程
- 1. Nexus搭建Maven私服
2011年7月27日
15:00
参考: http://www.sonatype.com/books/nexus-book/reference/
在开发过程中,有时候会使用到公司内部的一些开发包,显然把这些包放在外部是不合适
的。另外,由于项目一直在开发中,这些内部的依赖可能也在不断的更新。可以通过搭建公
司内部的Maven服务器,将第三方和内部的依赖统一管理。
这里使用Nexus来搭建本地的Maven服务器,过程比较简单。
一、安装服务器
1、下载
我们可以在nexus的官网上找到它的相关介绍,下载地址是:
http://nexus.sonatype.org/downloads/,在这里可以找到最新的版本,如果需要以前的版本,在
官网上应该也可以找到下载地址。我下载的是:nexus-oss-webapp-1.8.0-bundle.tar.gz。关于
Nexus的详细使用方法可以参照:Repository Management with Nexus.
2、安装
解压下载的文件:
# tar xzvf nexus-oss-webapp-1.8.0-bundle.tar.gz
解压后会在同级目录中,出现两个文件夹:nexus-oss-webapp-1.8.0和sonatype-work,前者
包含了nexus的运行环境和应用程序,后者包含了你自己的配置和数据。
3、启动nexus
在上面的提到,nexus的运行环境在nexus-oss-webapp-1.8.0目录,下面就进入这个目录启
动:
# cd nexus-oss-webapp-1.8.0/bin/jsw/linux-x86-64/
在这个目录下包含了一个文件夹和三个文件:lib、nexus、platform和wrapper,其中nexus
就是启动命令。
# ./nexus
执行上面的命令,可以得到nexus命令的用法提示:start 命令启动,stop命令停止。下面
启动nexus:
# ./nexus start
Starting Nexus OSS...
Started Nexus OSS
从控制台输出可以看到Nexus已经启动成功,我们可以通过log文件查看更详细的信息:
# cd ~/nexus-oss-webapp-1.8.0/log
# tail -f wrapper.log
在log中可以看到nexus默认监听的端口是8081。那么我们就可以在浏览器中访
问:http://host:8081/nexus,
二、配置Nexus
由于在新搭建的nexus环境中只是一个空的仓库,所以第一步就是要和远程的Maven中心
仓库进行同步。
分区 Maven 的第 1 页
- 3. 三、在项目中使用私服
在完成了上面的配置后,就可以将项目中默认的Repository切换为本地的私服了,只需要
在pom.xml中增加repositories就可以了:
1. <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
3. <modelVersion>4.0.0</modelVersion>
4.
5. <groupId>org.maven.demo</groupId>
6. <artifactId>MavenDemo</artifactId>
7. <version>0.0.1-SNAPSHOT</version>
8. <packaging>jar</packaging>
9.
10. <name>MavenDemo</name>
11. <url>http://maven.apache.org</url>
12.
13. <repositories>
14. <repository>
15. <snapshots>
16. <enabled>true</enabled>
17. </snapshots>
18. <id>public</id>
19. <name>Public Repositories</name>
20. <url>http://172.28.189.138:8081/nexus/content/groups/public/</url>
21. </repository>
22. </repositories>
23. <pluginRepositories>
24. <pluginRepository>
25. <id>public</id>
26. <name>Public Repositories</name>
27. <url>http://172.28.189.138:8081/nexus/content/groups/public/</url>
28. </pluginRepository>
29. </pluginRepositories>
30. <dependencies>
31. <dependency>
32. <groupId>junit</groupId>
33. <artifactId>junit</artifactId>
34. <version>4.8.1</version>
35. <type>jar</type>
36. <scope>compile</scope>
37. </dependency>
38. </dependencies>
39. <properties>
40. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
41. </properties>
42. </project>
将pom.xml保存后,再回过头来了看去nexus管理界面看,就会发现junit已经被下载到本
地的nexus服务器中了。
分区 Maven 的第 3 页
- 11. maven依赖包版本冲突解决(1)
2011年7月28日
9:29
在有冲突的依赖下面加上exclusion,如不想用slf4j-log4j12默认
的slf4j-api版本,而自己指定一个,可以这样:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
有时候不一定能发现是哪几个依赖冲突了,这时可以上
http://mavenrepository.com 查一下,比如发现lib里有
javassist-3.4.GA.jar和javassist-3.7.ga.jar,而自己
想用的是javassist-3.7.ga.jar,可以在上面的网站里
查javassist-3.4.GA,在This artifact is used by ... 里会列出依赖于它的一些dependency,
如
org.hibernate hibernate-core 3.3.1.GA
org.hibernate hibernate-entitymanager 3.3.2.GA
等,再在那些dependency里加入exclusion去掉javassist就可以了,如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
分区 Maven 的第 11 页
- 12. maven依赖包版本冲突解决(2)
2011年7月28日
9:34
传递依赖是maven最有特色的、最为方便的优点之一,可以省了很多配置。如a 依赖 b,b 依赖c 默认
a也会依赖 c。但是也会带来隐患,如版本冲突。当然maven也考虑到解决办法,可以使用exclusions
来排除相应的重复依赖。
但是我们还会遇到一个严重的问题,那就是,我怎么知道是哪个包的传递依赖产生的冲突 ?那该怎么
办呢?当然,maven也会有相应的解决方案。
首先,你要在pom.xml中加上maven-project-info-reports-plugin插件。
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>
maven-project-info-reports-plugin
</artifactId>
</plugin>
</reporting>
然后再执行:mvn project-info-reports:dependencies 。生成项目依赖的报表,这样你就能够在报
表中找出你版本冲突的相关性依赖了。如出现OutOfMemoryError错误,在系统环境中加入参数
MAVEN_OPTS=-Xmx512m
最后在相应的dependency中加上exclusions来排除相关的传递依赖。
例:
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
分区 Maven 的第 12 页
- 15. [...]
</project>
在各个子模块的 pom 中没有对 Junit 依赖的定义,但是从顶层 pom 中继承了依赖的定义。
为了看清楚可以在一个子模块 pom 所在目录下,执行命令
#mvn help:effective-pom
可以看到最终起效果的 pom ,这在找错时很有效。
2 .管理依赖
在 pom 中指明 dependency management 元素的方式 maven 结合项目继承来管理依赖。在多模块应用
中,可能多个子项目会有共同的依赖。此时为了正确运行,必须让所有的子项目使用依赖项的同一版
本。必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。因此,
应在顶层的 pom 中定义共同的依赖关系。
在 Proficio 应用的顶层 pom 中的 dependency management 段如下:
<dependencyManagement>
<dependencies >
<dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-model</artifactId>
<c>${project.version}</version>
</dependency >
<dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-api</artifactId>
<version>${project.version}</version>
</dependency >
<dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-core</artifactId>
<version>${project.version}</version>
</dependency >
分区 Maven 的第 15 页
- 16. <dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-store-memory</artifactId>
<version>${project.version}</version>
</dependency >
<dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-store-xstream</artifactId>
<version>${project.version}</version>
</dependency >
<dependency >
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-container-default</artifactId>
<version>1.0-alpha-9</version>
</dependency >
</dependencies >
</dependencyManagement>
注意 ${project.version} 变量指的是应用的 version 。
顶层 pom 中的 dependencies 与 dependencyManagement 中的 dependencies 元素有一个重要的区
别:
dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖
项;而 dependencies 元素则影响项目的依赖项。
检查 Proficio api 模块的 pom:
<project>
<parent>
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio</artifactId>
<version>1.0-SNAPSHOT</version>
分区 Maven 的第 16 页
- 17. </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>proficio-api</artifactId>
<packaging>jar</packaging>
<name>Proficio API</name>
<dependencies >
<dependency >
<groupId>com.devzuz.mvnbook.proficio</groupId>
<artifactId>proficio-model</artifactId>
</dependency >
</dependencies >
</project>
其中没有指明依赖项的版本信息,在顶层 pom 中的 dependencyManagement 中表明其优选的版本是
${project.version} 即 1.0-SNAPSHOT 。为使其模块 pom 完整,其版本信息会注入其中。只有当
dependencies 元素中没有指明版本信息时, dependencyManagement 中的 dependencies 元素才起作
用。
呵呵 一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的.
分区 Maven 的第 17 页
- 18. pom元素解释
2011年7月28日
11:07
<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>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<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>
• project : 所有pom的顶级元素
• modelVersion : 该pom用的对象模型(object model),这个属性是必须的,以防模型改进升级
• groupId : 项目的创建者,比如:com.panguso.app
• artifactId : 项目编译结果的文件名(不包括扩展名)
• packaging :编译好之后的包类型,比如:jar, war, ear,也可以指明包的生命周期,默认为jar
• version : 项目的版本
• name : 项目的显示名称
• url : 项目主面地址
• description : 项目的描述
分区 Maven 的第 18 页