SlideShare a Scribd company logo
1 of 18
Download to read offline
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 页
仓库进行同步。




  如果在Reindex(1.9中为Repair Index)之后,并没有同步到远程的仓库,可以检查每个
仓库的设置。下面是Maven Central的设置:




                   分区 Maven 的第 2 页
三、在项目中使用私服
        在完成了上面的配置后,就可以将项目中默认的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 页
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 页
(3)




这样就上传成功了!




以刚才上传成功的包为例,获取第三方包的dependency描述(在Artifact Information可以删除包):




                       分区 Maven 的第 5 页
MyEclipse Maven插件使用
2011年7月27日
15:47



MyEclipse 9 自带Maven插件。只能在新建立工程的时候指定建立Maven工程,因为MyEclipse默认的
目录结构和Maven目录结构不相同。

首先对MyEclipse的Maven插件进行配置,我选择了一个配置好的settings.xml加载上去了:




建立支持Maven的Java工程:




                       分区 Maven 的第 6 页
点击finish之后,稍等,工程便建立好了,工程目录结构如下:




其中main/java下是程序,test/java下放的是测试程序,target为编译之后的文件和打包完成之后的
文件。Maven的目录结构是定死的,是无法更改的。
可以运行一下该工程,如无意外,会输出Hello World 。
添加依赖
双击打开pom.xml,点击dependency选项卡,点击Add...




通过输入包的关键字,即可找到包,并添加到依赖中,以我们上传的第三方包为例:




                      分区 Maven 的第 7 页
通过输入包的关键字,即可找到包,并添加到依赖中,以我们上传的第三方包为例:




scope用于生成类存放的路径,比如编译时(compile),运行时(runtime)等等,有些包搜索不到,没
有找到是什么原因。
如果找不到包,就用下面的方法,




将上面图中代码直接粘贴到pom.xml <dependencies></dependencies>之间。
点击保存时,这个库,及这个库依赖的库就会自动下载下来了:




还可以查看依赖图,很漂亮啊:




                          分区 Maven 的第 8 页
还可以查看依赖图,很漂亮啊:




在该项目上点右键MyEclipse->Add Web Capabilities->修改Web root地址(点【浏览】按钮指定为当
前工作空间下的src/main/webapp文件夹) ,后面就可以跟正常的项目一样自动部署了




                          分区 Maven 的第 9 页
官方Maven
2011年7月27日
15:06

下载地址
http://maven.apache.org/download.html

环境变量设置
MVN_HOME=D:Kangzengjiworkspaceapache-maven-3.0
Path=%MVN_HOME%/bin (增加)

修改Maven配置
%MVN_HOME%/conf/settings.xml
配置示例见最后。




                                        分区 Maven 的第 10 页
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 页
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 页
查找依赖包
2011年7月28日
9:51



http://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 页
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 页
[...]

</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 页
<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 页
</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 页
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 页

More Related Content

Similar to Maven私服安装,Maven使用教程

Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训
ytsolar
 
项目开发实践No.1
项目开发实践No.1项目开发实践No.1
项目开发实践No.1
pepsixp
 
Maven技术分享
Maven技术分享Maven技术分享
Maven技术分享
wslfh2005
 
Lab 1 建立 HTTP與HTTPS網站.pdf
Lab 1 建立 HTTP與HTTPS網站.pdfLab 1 建立 HTTP與HTTPS網站.pdf
Lab 1 建立 HTTP與HTTPS網站.pdf
ssuser9026c8
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置
epst
 
Moodle 2.3 图文安装教程
Moodle 2.3 图文安装教程Moodle 2.3 图文安装教程
Moodle 2.3 图文安装教程
YUCHENG HU
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理
frankwsj
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
redhat9
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
Guo Albert
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetup
sunng87
 

Similar to Maven私服安装,Maven使用教程 (20)

项目自动化实施
项目自动化实施项目自动化实施
项目自动化实施
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训
 
项目开发实践No.1
项目开发实践No.1项目开发实践No.1
项目开发实践No.1
 
OSGi Small Lab
OSGi Small LabOSGi Small Lab
OSGi Small Lab
 
Maven技术分享
Maven技术分享Maven技术分享
Maven技术分享
 
用Maven管理專案的依賴關係
用Maven管理專案的依賴關係用Maven管理專案的依賴關係
用Maven管理專案的依賴關係
 
初探Maven 3
初探Maven 3初探Maven 3
初探Maven 3
 
Hadoop开发者入门专刊
Hadoop开发者入门专刊Hadoop开发者入门专刊
Hadoop开发者入门专刊
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
Lab 1 建立 HTTP與HTTPS網站.pdf
Lab 1 建立 HTTP與HTTPS網站.pdfLab 1 建立 HTTP與HTTPS網站.pdf
Lab 1 建立 HTTP與HTTPS網站.pdf
 
P6 服务器安装与配置
P6 服务器安装与配置P6 服务器安装与配置
P6 服务器安装与配置
 
Moodle 2.3 图文安装教程
Moodle 2.3 图文安装教程Moodle 2.3 图文安装教程
Moodle 2.3 图文安装教程
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
自动化运维管理
自动化运维管理自动化运维管理
自动化运维管理
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
Bypat博客出品-利用cent os快速构建自己的发行版-进阶版v1.1
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetup
 

Maven私服安装,Maven使用教程