本地仓库是开发者本地电脑中的一个目录,用于缓存从远程仓库下载的构件。默认的本地仓库是 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>
如果默认的中央仓库无法满足项目需求,可能需要的构件在另外一个远程仓库,如 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 文件中指定的远程仓库。镜像仓库=中央仓库。 镜像仓库是用于替代中央仓库的。本地仓库是本地的一个文件夹,远程/镜像仓库相当于远程文件夹
<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>
<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 插件发布部署并执行 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 工程开发过程中,都通过中央仓库实现构件的依赖和管理,那么中央仓库的负荷过高,也会严重影响工程构建的效率。如果使用私服,可以分散中央仓库的负荷,只有在私服中没有需要依赖的构件时才会去连接中央仓库。
安装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 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>
<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>