Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Maven私服安装,Maven使用教程

5,543 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Maven私服安装,Maven使用教程

  1. 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 页
  2. 2. 仓库进行同步。 如果在Reindex(1.9中为Repair Index)之后,并没有同步到远程的仓库,可以检查每个仓库的设置。下面是Maven Central的设置: 分区 Maven 的第 2 页
  3. 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 页
  4. 4. Maven私服的管理方法2011年7月27日15:07基本信息Maven版本:1.9.2仓库地址:http://192.168.39.88:8081/nexus/content/groups/public/管理地址:http://192.168.39.88:8081/nexus/index.html用户名:admin密码: admin123上传第三方包步骤 1. 打开管理地址,点击右上角Log In,用管理员账户登录 2. 打开上传选项卡,按提示操作上传,如下两图所示: (1)(2) 分区 Maven 的第 4 页
  5. 5. (3)这样就上传成功了!以刚才上传成功的包为例,获取第三方包的dependency描述(在Artifact Information可以删除包): 分区 Maven 的第 5 页
  6. 6. MyEclipse Maven插件使用2011年7月27日15:47MyEclipse 9 自带Maven插件。只能在新建立工程的时候指定建立Maven工程,因为MyEclipse默认的目录结构和Maven目录结构不相同。首先对MyEclipse的Maven插件进行配置,我选择了一个配置好的settings.xml加载上去了:建立支持Maven的Java工程: 分区 Maven 的第 6 页
  7. 7. 点击finish之后,稍等,工程便建立好了,工程目录结构如下:其中main/java下是程序,test/java下放的是测试程序,target为编译之后的文件和打包完成之后的文件。Maven的目录结构是定死的,是无法更改的。可以运行一下该工程,如无意外,会输出Hello World 。添加依赖双击打开pom.xml,点击dependency选项卡,点击Add...通过输入包的关键字,即可找到包,并添加到依赖中,以我们上传的第三方包为例: 分区 Maven 的第 7 页
  8. 8. 通过输入包的关键字,即可找到包,并添加到依赖中,以我们上传的第三方包为例:scope用于生成类存放的路径,比如编译时(compile),运行时(runtime)等等,有些包搜索不到,没有找到是什么原因。如果找不到包,就用下面的方法,将上面图中代码直接粘贴到pom.xml <dependencies></dependencies>之间。点击保存时,这个库,及这个库依赖的库就会自动下载下来了:还可以查看依赖图,很漂亮啊: 分区 Maven 的第 8 页
  9. 9. 还可以查看依赖图,很漂亮啊:在该项目上点右键MyEclipse->Add Web Capabilities->修改Web root地址(点【浏览】按钮指定为当前工作空间下的src/main/webapp文件夹) ,后面就可以跟正常的项目一样自动部署了 分区 Maven 的第 9 页
  10. 10. 官方Maven2011年7月27日15:06下载地址http://maven.apache.org/download.html环境变量设置MVN_HOME=D:Kangzengjiworkspaceapache-maven-3.0Path=%MVN_HOME%/bin (增加)修改Maven配置%MVN_HOME%/conf/settings.xml配置示例见最后。 分区 Maven 的第 10 页
  11. 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.GAorg.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. 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 页
  13. 13. 查找依赖包2011年7月28日9:51http://192.168.39.88:8081/nexus/index.html#nexus-search;quick~如上图,你可以在左边的搜索框输入你想要搜索的内容,如org.apache.activemq,右边就会出现相应的结果(pom, jar)。点击最右边的pom链接可以直接查看pom内容(然后直接复制粘贴你需要的groupId,artifactId和version),你也可以点击artifact直接下载jar文件。 分区 Maven 的第 13 页
  14. 14. dependencyManagement作用2011年7月28日11:06以前一直没有在意,今天建立maven工程的时候在<dependencyManagement>节点下加入了junit依赖,结果在dependency Graph中没有发现junit的依赖关系,怎么回事?没有加入项目依赖?遂google之得解释:1 .使用项目继承利用项目继承可以将结构信息,部署信息,共同的依赖信息放置在单一的位置。在每个工程的 pom中:[...]<parent><groupId>org.apache.maven.proficio</groupId><artifactId>proficio</artifactId><version>1.0-SNAPSHOT</version></parent>[...]这使得项目的 pom 可以继承顶层 pom 中的定义,检查顶层 pom 的 dependencies 部分:<project>[...]<dependencies ><dependency ><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency ></dependencies >[...] 分区 Maven 的第 14 页
  15. 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. 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. 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. 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 页

×