Maven使用

  • 仓库配置
    • 配置Maven本地仓库存放位置
    • 配置镜像仓库地址
    • POM配置仓库地址
    • 远程仓库认证
    • 访问仓库优先级
  • Maven项目构建
    • 工程种类(POM、JAR、WAR)及标签定义
    • 工程关系
      • 依赖
      • 继承
      • 聚合
  • Maven插件
    • 编译器插件
      • pom中配置当前工程插件
      • 全局编译器插件配置
    • Tomcat 管理插件
      • 本地应用
      • 远程热部署
  • Maven私服
    • 环境搭建
    • 仓库类型简述
    • 私服应用
      • settings.xml 文件
      • pom.xml 文件
    • 注意事项

仓库配置

配置Maven本地仓库存放位置

本地仓库是开发者本地电脑中的一个目录,用于缓存从远程仓库下载的构件。默认的本地仓库是 user.home/.m2/repository使 u s e r . h o m e / . m 2 / r e p o s i t o r y 。 用 户 可 使 用 {maven_home}\conf\settings.xml 文件修改本地仓库。具体内容如下:


<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">
    
    <localRepository>/put/your/local/repository/herelocalRepository>
    
settings>

配置镜像仓库地址

如果仓库 A 可以提供仓库 B 存储的所有内容,那么就可以认为 A 是 B 的一个镜像。例如:在国内直接连接中央仓库下载依赖,由于一些特殊原因下载速度非常慢。这时,我们可以使用阿里云提供的镜像 http://maven.aliyun.com/nexus/content/groups/public/ 来替换中央仓库 http://repol.maven.org/maven2/。修改 maven 的 setting.xml 文件,具体内容如下:


<mirrors>
    
    <mirror>
        
        <id>alimavenid>
        
        <name>aliyun mavenname>
        
        <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        
        <mirrorOf>centralmirrorOf>
    mirror>
mirrors>

POM配置仓库地址

如果默认的中央仓库无法满足项目需求,可能需要的构件在另外一个远程仓库,如 JBoss
Maven 仓库,可以 POM 中配置该仓库。

<repositories>
        <repository>
            
            <id>jbossid>
            
            <name>JBoss Repositoryname>
            
            <url>https://repository.jboss.com/maven2/url>
            
            <layout>defaultlayout>
            
            <snapshots>
                <enabled>falseenabled>
            snapshots>
            
            <releases>
                <enabled>trueenabled>
            releases>
        repository>
    repositories>

远程仓库认证

这里的 id=my-proj 一定要和 pom.xml 中仓库的 id 一致,这是它们之间唯一的联系。
settings.xml 的 servers 中就是用来配服务器授权信息的,当然不仅可以配置仓库服务器认证信息,还可以配置其它的比如 tomcat 服务器授权信息也可以在这里配置。

<servers>
    <server>
        
        <id>my-projid>
        
        <username>repo-userusername>
        
        <password>repo-pwdpassword>
    server>
servers>

访问仓库优先级

本地仓库,镜像仓库,中央仓库,pom 文件中指定的远程仓库。镜像仓库=中央仓库。 镜像仓库是用于替代中央仓库的。本地仓库是本地的一个文件夹,远程/镜像仓库相当于远程文件夹

Created with Raphaël 2.1.2 开始 本地仓库 POM文件中指定仓库 远程仓库 镜像仓库? 结束 中央仓库 yes no

Maven项目构建

工程种类(POM、JAR、WAR)及标签定义

<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.0modelVersion>
    
    <groupId>groupNamegroupId>
    
    <artifactId>artifactNameartifactId>
    
    <version>1.0version>
    
    
    <packaging>pompackaging>
    
    
    
    
    
    <properties>
        
        <junit.version>4.12junit.version>
    properties>

    
    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>${junit.version}version>
                
                <scope>testscope>
            dependency>
        dependencies>
    dependencyManagement>
    
    <dependencies>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>${junit.version}version>
            
            <scope>testscope>
        dependency>
    dependencies>
project>

工程关系

依赖

即 A 工程开发或运行过程中需要 B 工程提供支持,则代表 A 工程依赖 B 工程。在这种情况下,需要在 pom.xml 文件中增加下属配置定义依赖关系:

<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.0modelVersion>
    
    <groupId>localPrjectGroupNamegroupId>
    
    <artifactId>localPrjectArtifactNameartifactId>
    
    <version>localPrjectVersionNoversion>
    
    <packaging>packagingTypeNamepackaging>
    
    <dependencies>
        
        <dependency>
            
            <groupId>groupNamegroupId>
            
            <artifactId>artifactNameartifactId>
            
            <version>versionNoversion>
            
            <scope>systemscope>
        dependency>
    dependencies>
project>

继承

如果 A 工程继承 B 工程,则代表 A 工程默认依赖 B 工程依赖的所有资源,且可以应用 B 工程中定义的所有资源信息。被继承的工程(B 工程)只能是 POM 工程。具体工程 pom.xml 文件配置如下:

父工程

<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.0modelVersion>
    <groupId>parentGroupgroupId>
    <artifactId>parentProjectartifactId>
    <version>1.0version>
    <packaging>pompackaging>
    
    <dependencyManagement>
        <dependencies>dependencies>
    dependencyManagement>
project>

子工程

<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.0modelVersion>
    <parent>
        <groupId>parentGroupgroupId>
        <artifactId>parentProjectartifactId>
        <version>1.0version>
    parent>
    
    <groupId>childGroupgroupId>
    <artifactId>childProjectartifactId>
    <version>1.0version>
project>

聚合

当我们开发的工程拥有 2 个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译, 测试,运行。这个时候我们就需要一个聚合工程。
在创建聚合工程的过程中,总的工程必须是一个 POM 工程(Maven Project),各子模块
可以是任意类型模块(Maven Module )。所有聚合工程和聚合模块必须处于同一个组
(groupId)中,且聚合工程可以嵌套。具体 pom.xml 文件配置如下:

总工程配置

<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.0modelVersion>
    <groupId>superGroupgroupId>
    <artifactId>superProjectartifactId>
    <version>1.0version>
    <packaging>pompackaging>
    
    <modules>
        <module>subProject1module>
        <module>subProject2module>
    modules>
project>

子工程1

<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.0modelVersion>
    <parent>
        <groupId>superGroupgroupId>
        <artifactId>superProjectartifactId>
        <version>1.0version>
    parent>
    <artifactId>subProject1artifactId>
project>

子工程2

<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.0modelVersion>
    <parent>
        <groupId>superGroupgroupId>
        <artifactId>superProjectartifactId>
        <version>1.0version>
    parent>
    <artifactId>subProject2artifactId>
project>

Maven插件

编译器插件

pom中配置当前工程插件

<build>
    <plugins>
        
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-compiler-pluginartifactId>
            <version>3.2version>
            <configuration>
                <source>1.7source>
                <target>1.7target>
                <encoding>UTF-8encoding>
            configuration>
        plugin>
    plugins>
build>

全局编译器插件配置

下列配置相当于maven默认启用1.7版本了

<profile>
    
    <id>jdk-1.7id>
    
    <activation>
        <activeByDefault>trueactiveByDefault>
        <jdk>1.7jdk>
    activation>
    
    <properties>
        <maven.compiler.source>1.7maven.compiler.source>
        <maven.compiler.target>1.7maven.compiler.target>
        <maven.compiler.compilerVersion>1.7maven.compiler.compilerVersion>
    properties>
profile>

Tomcat 管理插件

使用 Tomcat 插件发布部署并执行 war 工程的时候,使用 maven build 功能实现。应用启动命令为: tomcat7:run。命令中的 tomcat7 是插件命名,由插件提供商决定。run 为插件中的具体功能。具体 pom.xml 文件的配置如下:

本地应用

<build>
    <plugins>
        
        <plugin>
            <groupId>org.apache.tomcat.mavengroupId>
            <artifactId>tomcat7-maven-pluginartifactId>
            <version>2.2version>
            <configuration>
                <port>8080port>
                <path>/path>
            configuration>
        plugin>
    plugins>
build>

远程热部署

远程热部署是指,在 Tomcat 容器运行过程中,动态实现 war 工程的部署,重新部署功能。使用 maven build 功能实现,具体命令为: tomcat7:deploy 或 tomcat7:redeploy。其中
deploy 代表第一次部署 war 工程;redeploy 代表 Tomcat 容器中已有同名应用,本次操作为重新部署同名 war 工程。
实现热部署需要远程访问 Tomcat 容器,所以 Tomcat 容器需要提供合适的访问方式和验证方式。
实现热部署,需要访问 Tomcat 容器提供的原始应用 manager,并提供有效有权限的访问用户,所以在 Tomcat 中也需提供部分配置。具体配置内容如下:

Tomcat 中的 conf/tomcat-users.xml 文件的配置

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcatUsername" password="tomcatPassword" roles="manager-gui,manager-script"/>

pom.xml 文件中的配置

<build>
    <plugins>
        
        <plugin>
            <groupId>org.apache.tomcat.mavengroupId>
            <artifactId>tomcat7-maven-pluginartifactId>
            <version>2.2version>
            <configuration>
                
                <path>/ROOTpath>
                
                <url>http://ip:port/manager/texturl>
                
                <username>tomcatUsernameusername>
                <password>tomcatPasswordpassword>
            configuration>
        plugin>
    plugins>
build>

Maven私服

私服是一种特殊的远程仓库,它是架设在局域网的仓库服务,私服代理广域网上的远程仓库,供局域网使用。中央仓库是有限的。如果所有的 Maven 工程开发过程中,都通过中央仓库实现构件的依赖和管理,那么中央仓库的负荷过高,也会严重影响工程构建的效率。如果使用私服,可以分散中央仓库的负荷,只有在私服中没有需要依赖的构件时才会去连接中央仓库。

环境搭建

安装jdk
JDK 官 方 下 载 地 址 为 : http://www.oracle.com/technetwork/java/javase/downloads/index.html

配置环境变量

export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH

Nexus下载

Nexus 官 方 下 载 地 址 为 : https://www.sonatype.com/nexus-repository-oss

Nexus 资源包解压

在/usr/local 目录中创建子目录 nexus: mkdir /usr/local/nexus
解压 Nexus 到指定目录:
tar -zxvf nexus-2.11.2-03-bundle.tar.gz -C /usr/local/nexus
Nexus 压缩包中包含两个子目录: nexus-2.11.2-03 和 sonatype-work
nexus-2.11.2-03 是具体的私服应用内容,sonatype-work 是 Nexus 私服下载的构件存放工作目录。

 mkdir /usr/local/nexus
 tar -zxvf nexus-2.11.2-03-bundle.tar.gz -C /usr/local/nexus

检查私服端口和工作目录
在 nexus-2.11.2-03 目录中有子目录 conf ,其中保存私服应用的配置信息。查看
nexus.properties 文件,确定私服访问端口和工作目录。此操作可不做任何内容修改。配置文件内容如下:

# Jetty section,Nexus 私服应用是使用 Jetty 提供 web 服务的,下述内容为 Jetty 配置。
application-port=8081   # 私服访问端口
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus    # Nexus 私服 WEB 应用所在位置
nexus-webapp-context-path=/nexus    # Nexus 私服 WEB 应用 contextPath

# Nexus section Nexus 私服配置信息
nexus-work=${bundleBasedir}/../sonatype-work/nexus # 私服工作目录,即构件保存目录
runtime=${bundleBasedir}/nexus/WEB-INF # 私服 WEB 应用运行目录

修改 Nexus 运行用户
Nexus 私服在启动后,私服应用需要访问 Linux 的文件系统,所以需要有足够的权限。
Nexus 的启动脚本文件中,可以指定私服应用的访问用户,此信息在nexus-2.11.2-03/bin/nexus
脚本文件中定义。需要修改的信息如下:

# NOTE - This will set the user which is used to run the Wrapper as well as 
#   the JVM and is not useful in situations where a privileged resource or 
#   port needs to be allocated prior to the user being changed. 
#RUN_AS_USER=   #原内容
RUN_AS_USER=root    #修改后的内容,代表 Nexus 私服使用 root 用户权限。

修改防火墙,开放 Nexus 私服端口访问
修改防火墙配置文件,开放 Nexus 私服的访问端口 8081(2.2.2.3 章节内容)。
vi /etc/sysconfig/iptables
增加下述内容:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT

重新启动防火墙:

service iptables restart

启动并测试访问
启动 Nexus 私服:
/usr/local/nexus/nexus-2.11.2-03/bin/nexus start

可通过命令检查私服运行状态:
/usr/local/nexus/nexus-2.11.2-03/bin/nexus status
内容如下为私服运行中:

也可使用浏览器访问 Nexus 私服 WEB 应用, 访问地址为:
http://ip:8081/nexus (ip 为 Nexus 所在系统的访问 IP)

[root@cx bin]# ./nexus start
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
Starting Nexus OSS...
Started Nexus OSS.
[root@cx bin]# ./nexus status
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
Nexus OSS is running (1086).

登录

Nexus 默认提供管理用户,用户名为 admin,密码为 admin123。
点开http://ip:8081/nexus 右上角login in 登录

仓库类型简述

常用仓库类型为:hosted 和 proxy

– 仓库组:Nexus 通过仓库组来统一管理多个仓库,这样访问仓库组就相当于访问仓库组管理的多个仓库。

– hosted
宿主仓库:主要用于发布内部项目构件或第三方的项目构件(如购买商业的构件)以及无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)。

– releases
发布内部的 releases 模块的仓库,所有非快照版本工程都发布到此仓库中。

– snapshots
发布内部的快照模块的仓库,所有工程版本以 SNAPSHOT 结尾的都发布到此仓库中。

– rd party
第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去

– proxy
代理仓库:代理公共的远程仓库。

– virtual
虚拟仓库:用于适配 Maven 1。

– 代理仓库配置
设置 proxy 代理仓库(Apache Snapshots/Central/Codehaus Snapshots)准许远程下载。

私服应用

要在 Maven 工程中使用私服,需要提供私服配置信息。

settings.xml 文件


<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">

    <localRepository>D:/repositorieslocalRepository>
    <interactiveMode>trueinteractiveMode>
    <offline>falseoffline>

    <pluginGroups>
        <pluginGroup>org.mortbay.jettypluginGroup>
        <pluginGroup>org.jenkins-ci.toolspluginGroup>
    pluginGroups>

    <proxies>
    proxies>

    <servers>
        <server>
            
            <id>nexus-releasesid>
            <username>deploymentusername>
            <password>deployment123password>
        server>
        <server>
            <id>nexus-snapshotsid>
            <username>deploymentusername>
            <password>deployment123password>
        server>
    servers>

    <profiles>
        <profile>
            <id>jdk-1.7id>
            <activation>
                <activeByDefault>trueactiveByDefault>
                <jdk>1.7jdk>
            activation>
            <properties>
                <maven.compiler.source>1.7maven.compiler.source>
                <maven.compiler.target>1.7maven.compiler.target>
                <maven.compiler.compilerVersion>1.7maven.compiler.compilerVersion>
            properties>
        profile>
        <profile>
            <id>cxid>
            <activation>
                <activeByDefault>falseactiveByDefault>
                <jdk>1.7jdk>
            activation>
            <repositories>
                
                <repository>
                    
                    <id>nexusid>
                    
                    <url>http://cx:8081/nexus/content/groups/public/url>
                    
                    <releases>
                        <enabled>trueenabled>
                    releases>
                    
                    <snapshots>
                        <enabled>trueenabled>
                    snapshots>
                repository>
            repositories>
            <pluginRepositories>
                
                <pluginRepository>
                    <id>nexusid>
                    <url>http://cx:8081/nexus/content/groups/public/url>
                    <releases>
                        <enabled>trueenabled>
                    releases>
                    <snapshots>
                        <enabled>trueenabled>
                    snapshots>
                pluginRepository>
            pluginRepositories>
        profile>
    profiles>

    
    <activeProfiles>
        
        <activeProfile>cxactiveProfile>
    activeProfiles>
settings>

pom.xml 文件

<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.0modelVersion>
    <groupId>groupgroupId>
    <artifactId>projectartifactId>
    <version>1.0version>

    <distributionManagement>
        <repository>
            <id>nexus-releasesid>
            <name>Nexus Release Repositoryname>
            <url>http://cx:8081/nexus/content/repositories/releases/url>
        repository>
        <snapshotRepository>
            <id>nexus-snapshotsid>
            <name>Nexus Snapshot Repositoryname>
            <url>http://cx:8081/nexus/content/repositories/snapshots/url>
        snapshotRepository>
    distributionManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-source-pluginartifactId>
                <version>2.1.2version>
                <executions>
                    <execution>
                        <id>attach-sourcesid>
                        <goals>
                            <goal>jargoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

注意事项

– 默认安装下:
设置 proxy 代理仓库(Apache Snapshots/Central/Codehaus Snapshots)准许远程下载。
自此 Nexus 私服安装配置结束,*私服下载中央仓库资源需要时间,一般企业都会提前搭建。
同版本不允许重复发布,除非更改设置

– setting中 陪着Mirror和repository要注意
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。其实,mirror表示的是两个Repository之间的关系,在maven配置文件(setting.xml)里配置了mirrors,即定义了两个Repository之间的镜像关系。

如下,拦截所有请求重定向到阿里云仓库:

    <mirror>
        <id>nexus-aliyunid>
        <mirrorOf>*mirrorOf>
        <name>Nexus aliyunname>
        <url>http://maven.aliyun.com/nexus/content/groups/publicurl>
    mirror>

你可能感兴趣的:(java)