Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是一个跨平台
的项目管理工具,它是使用java开发的,它要依赖于jdk1.6及以上。主要服务于基于Java平台的项目构建
、依赖管理
和项目信息管理
。
Maven主要有两个功能:
1、项目构建
2、依赖管理
依赖指的就是jar包。
项目构建如下图所示:
构建过程如下图所示:
如下图所示:
在maven安装目录的conf目录里面有一个settings.xml文件,这个文件就是maven的全局配置文件。 该文件中配置了maven本地仓库的地址,如下图所示:
localRepository:用户仓库,用于检索依赖包路径。 默认在系统的用户目录下的m2/repository中,该目录是本地仓库的目录。如下图所示:
用户配置文件的地址:~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来再进行修改),其中~表示当前用户路径C:\Users[UserName]。如下图所示:
注意:
一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。
配置步骤如下:
第一步:创建一个本地仓库目录,比如:D:\learn\Java\apache-maven-3.5.4\repository。
第二步:复制maven的全局配置文件到~/.m2目录下,即创建用户配置文件
第三步:修改maven的用户配置文件。如下图所示:
注意:
用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转而使用用户所设置的仓库,否则使用全局配置文件中的默认路径仓库。
详解如下:
Project
|-src(源码包)
| |-main(正常的源码包)
| | |-java —— 存放项目的.java文件的目录
| | |-resources —— 存放项目资源文件的目录,例如:spring, hibernate等配置文件
| |-test(测试的源码包)
| |-java —— 存放所有测试.java文件的目录,例如:JUnit测试类
| |-resources —— 存放测试资源文件的目录
|-target —— 目标文件输出位置,例如:.class文件、.jar文件、.war文件、报告等信息
|-pom.xml ——maven项目核心配置文件,即maven工程的描述文件
package com.itheima.maven;
public class HelloMaven {
public String sayHello(String name) {
return "hello " + name;
}
}
package com.itheima.maven;
import org.junit.test;
import static junit.framework.Assert.*;
public class TestHelloMaven {
@Test
public String testSayHello() {
HelloMaven hw = HelloMaven();
String result = hw.sayHello("maven");
assertEquals("hello maven", result);
}
}
<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">
<!-- 版本:4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织名称:暂时使用 组织名称+项目名称 作为组织名称 -->
<!-- 组织名称:实际名称 按照访问路径规范设置,通常以功能作为名称:eg: junit spring -->
<groupId>com.itheima.maven</groupId>
<!-- 项目名称 -->
<artifactId>HelloMaven</artifactId>
<!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
<!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号 -->
<version>0.0.1</version>
<!-- 名称:可省略 -->
<name>Hello</name>
<!-- 依赖关系 -->
<dependencies>
<!-- 依赖设置 -->
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.9</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
注意事项:
到此maven工程创建成功。
Maven的命令需要在pom.xml所在目录中执行以下命令。
3.3.1、mvn compile
执行 mvn compile 命令,完成编译操作。
执行完毕后,会生成target目录和maven-status目录(新版本出现的),该目录中存放了编译后的字节码文件。
3.3.2、mvn clean
执行 mvn clean 命令
执行完毕后,会将target目录删除。
3.3.3、mvn test
执行 mvn test 命令,该命令会将test目录中的源码进行编译,完成单元测试操作。
执行完毕后,会在target目录中生成三个文件夹:maven-status(旧版本是surefire)、surefire-reports(测试报告)、test-classes(测试的字节码文件)
3.3.4、mvn package
执行 mvn package 命令,完成打包操作。
执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war。本例中是:helloMaven-0.0.1.jar
3.3.5、mvn install
执行 mvn install 命令,完成将打好的jar包安装到本地仓库的操作。
执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用。
3.3.6、mvn clean compile
cmd 中录入 mvn clean compile 命令
组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类。
3.3.7、mvn clean test
cmd 中录入 mvn clean test 命令
组合指令,先执行clean,再执行test,通常应用于测试环节。
3.3.8、mvn clean package
cmd 中录入 mvn clean package 命令
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前。
执行过程:
清理 --> 清空环境
编译 --> 编译源码
测试 --> 测试源码
打包 --> 将编译的非测试类打包
3.3.9、mvn clean install
cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中。
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前。
执行过程:
清理 --> 清空环境
编译 --> 编译源码
测试 --> 测试源码
打包 --> 将编译的非测试类打包
部署 --> 将打好的包发布到资源仓库中
手动安装M2Eclipse插件后,截图同上。
通过骨架创建maven工程,创建的是Java工程。
输入GroupId、ArtifactId、Version、Package信息点击finish完成
/MavenFirst/src/test/resources
package com.itheima.maven;
public class MavenFirst {
public String sayHello(String name) {
return "hello " + name;
}
}
package com.itheima.maven;
import org.junit.Assert;
import org.junit.Test;
// import static junit.framework.Assert.*;
public class TestMavenFirst {
@Test
public void testSayHello() {
MavenFirst first = new MavenFirst();
String result = first.sayHello("maven");
Assert.assertEquals("hello maven", result);
}
}
可以在菜单中看到maven常用的命令已经以菜单的形式出现。 例如: Maven build Maven build… Maven clean Maven install Maven package Maven test 其中: Maven build和Maven build… 并不是Maven的命令。 Maven build…只是提供一个命令输入功能,可以在此功能中输入自定义的Maven命令。如下图所示: Maven build的功能就是执行上次自定义命令。
通过选择骨架创建maven工程,每次选择骨架时都需要联网下载,如果网络不通或者较慢的情况下会有很长时间的等待。使用很是不方便,所以创建工程时可以不选择骨架直接创建工程。
<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.itheima.maven</groupId>
<artifactId>MavenSecond</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 在MavenSecond工程中依赖使用Junit的代码 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!-- 同理:在MavenSecond工程中依赖使用MavenFirst工程的代码 -->
<dependency>
<groupId>com.itheima.maven</groupId>
<artifactId>MavenFirst</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
package com.itheima.maven;
public class MavenSecond {
public String sayHello(String name) {
MavenFirst first = new MavenFirst();
return first.sayHello(name);
}
}
注意
:会出现一个问题,如下图所示:
解决办法: 办法一: 1、这是因为未Update Project…,并且项目的clean与maven的clean不同步的结果
2、选择要更新的项目
错误消失了,感觉整个世界都清爽了许多,如下图所示:
办法二: maven项目,clean build之后;MyEclipse也需要 Project --> Clean… 下,如下图所示:
package com.itheima.maven;
import org.junit.Assert;
import org.junit.Test;
public class TestMavenSecond {
@Test
public void testSayHello() {
MavenSecond second = new MavenSecond();
String result = second.sayHello("maven");
Assert.assertEquals("hello maven", result);
}
}
如果MavenFirst工程没有安装,则会出现以下错误:
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.itheima.maven:MavenSecond >--------------------
[INFO] Building MavenSecond 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for com.itheima.maven:MavenFirst:jar:0.0.1-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.884 s
[INFO] Finished at: 2018-09-24T12:30:47+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project MavenSecond: Could not resolve dependencies for project com.itheima.maven:MavenSecond:jar:0.0.1-SNAPSHOT: `Could not find artifact com.itheima.maven:MavenFirst:jar:0.0.1-SNAPSHOT` -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
提示找不到MavenFirst的jar包。当系统运行时是从本地仓库中找依赖的jar包的,所以必须先MavenFirst安装才能正常运行,需要在MavenFirst工程上运行 mvn install命令安装到本地仓库。然后在MavenSecond工程上再次运 mvn test 命令测试工程。 正确的测试结果如下:
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.itheima.maven:MavenSecond >--------------------
[INFO] Building MavenSecond 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ MavenSecond ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ MavenSecond ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\learn\Java\MyEclipse\Workspaces\MyEclipse 2017 CI\MavenSecond\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ MavenSecond ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ MavenSecond ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\learn\Java\MyEclipse\Workspaces\MyEclipse 2017 CI\MavenSecond\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ MavenSecond ---
[INFO] Surefire report directory: D:\learn\Java\MyEclipse\Workspaces\MyEclipse 2017 CI\MavenSecond\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.itheima.maven.TestMavenSecond
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.482 s
[INFO] Finished at: 2018-09-24T12:33:39+08:00
[INFO] ------------------------------------------------------------------------
<dependencies>
<!-- 在MavenSecond工程中依赖使用Junit的代码 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!-- 同理:在MavenSecond工程中依赖使用MavenFirst工程的代码 -->
<dependency>
<groupId>com.itheima.maven</groupId>
<artifactId>MavenFirst</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
详解如下:
其中依赖范围scope 用来控制`依赖`和`编译、测试、运行的classpath的关系`,主要的是三种依赖关系如下:
1.compile:默认编译依赖范围。对于编译、测试、运行三种classpath都有效。
2.test:测试依赖范围。只对于测试classpath有效。
3.provided:已提供依赖范围。对于编译、测试的classpath都有效,但对于运行的classpath无效。因为容器已经提供,例如:servlet-api。
4.runtime:运行时依赖范围。例如:jdbc驱动。
如果C中使用B,B中使用A,则称B是C的直接依赖,而称A是C的间接依赖。
C->B,B->A
C直接依赖B
C间接依赖A
详解如下:
左边第一列表示第一直接依赖范围
上面第一行表示第二直接依赖范围
中间的交叉单元格表示传递性依赖范围。
总结:
当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
当第二直接依赖的范围是test的时候,依赖不会得以传递。
当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provide。
当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime。
跨pom文件
的依赖冲突;一种是同一个pom文件中
的依赖冲突。 依赖的jar包如下:
如果MavenSecond工程中重新依赖junit的4.8版本,那么MavenSecond和MavenThird中都是使用了4.8本,这体现来依赖的`就近使用原则`。
依赖的jar包如下:
依赖的jar包如下:
`<optional>` 标签表示该依赖是否可选,默认是false。
可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去。
可选依赖不好使,因为有的工程想要该依赖,有的工程不想要该依赖,而你在源头就已经设置成可选的了,这样就导致不好使了。
如下图所示:
`<exclusions>`标签可以排除依赖。排除依赖包中所包含的依赖关系,`不需要添加版本号`。
如果在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话可以配置exclusions进行排除。
这种方式更灵活,在实际的项目中也是这种方式。
如下图所示:
对所有的构建过程进行抽象和统一
。包括项目清理
、初始化
、编译
、打包
、测试
、部署
等几乎所有构建步骤。
生命周期可以理解为构建工程的步骤。
每套生命周期都由一组阶段(Phase)组成
,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean,如果我们运行 mvn post-clean,那么 pre-clean、clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
`compile` 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
`test` 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
`package` 接受编译好的代码,打包成可发布的格式,如:jar 。
pre-integration-test
integration-test
post-integration-test
verify
`install` 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这样大大减轻了程序员的工作。
。
这也就是为什么我们运行mvn install的时候,代码会被编译、测试、打包。
此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
pre-site 执行一些需要在生成站点文档之前完成的工作
`site` 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
`site-deploy` 将生成的站点文档部署到特定的服务器上
这里经常用到的site阶
段和site-deploy阶段
,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
但是一般在工程中很少使用个,领导要看的是更简单、更直接东西,比如:做的PPT、报表等。
Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。每个插件都能实现一个功能,每个功能就是一个插件目标。Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。 插件(plugin),每个插件都能实现一个阶段的功能。Maven的核心是生命周期,但是生命周期相当于主要指定了maven命令执行的流程顺序,而没有真正实现流程的功能,功能是有插件来实现的。 比如:compile就是插件maven-compiler-plugin的一个插件目标。
编译使用的jdk是由Maven编译插件指定,如果我们没有指定编译用的jdk版本,当我们修改了编译用的jdk版本,一更新Maven项目,就会还原回去,还原成默认配置的编译用的jdk版本。如下图所示:
我们现在要配置编译插件:指定编译用的jdk版本 示例代码如下: /MavenFirst/pom.xml
<build>
<plugins>
<!-- 配置编译插件:指定编译用的jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
示例代码截图:
然后我们保存修改配置文件后,在工程上点击右键选择Maven --> Update Project…, 即再次更新Maven项目,发现编译用的jdk版本变了,如下图所示:
使用maven创建一个Web工程,不使用骨架。步骤如下:
web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
第一个Maven Web工程!
</body>
</html>
添加插件代码如下: /MavenWeb/pom.xml
<build>
<plugins>
<plugin>
<!-- 配置tomcat7插件 -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8085</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
使用tomcat7来运行web工程,它的命令是:tomcat7:run 效果截图如下:
在maven中的继承,指的是pom文件的继承。继承是为了消除重复,可以把很多相同的配置提取出来。例如:grouptId,version等。
创建maven工程,不使用骨架,如下图所示:
/MavenParent/pom.xml文件截图如下:
我们使用方式一:
/MavenSub/pom.xml文件截图如下:
同理: 方式二:原有工程继承父工程只需要在pom文件中添加parent节点即可。
在父工程中对jar包进行依赖,在子工程中都会继承此依赖。
子工程依赖效果如下图所示:
Maven使用dependencyManagement 标签来管理依赖的版本号。
注意:此处只是定义依赖jar包的版本号,并不实际依赖。如果子工程中需要依赖jar包还需要添加dependency节点。
父工程的pom文件:
没有真实依赖,如下图所示:
子工程的pom文件:
当子工程配置好后,就会有真实依赖,如下图所示:
当父工程中定义的jar包越来越多,找起来越来越麻烦,所以可以把版本号提取成一个属性集中管理
。
子工程的jar包版本不受影响。
聚合一般是一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。
例如:电商项目中,包括商品模块、订单模块、用户模块等。就可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。
例如:在真实项目中,同一个项目中的表现层、业务层、持久层,也可以分层创建不同的工程,最后打包运行时,再聚合到一起。对于业务层和持久层,它们可以在多个工程中被使用,所以一般会将业务层和持久单独创建为java工程,为其他工程依赖。
聚合工程的打包方式必须是pom,一般把聚合工程和父工程合并为一个工程。
第一步:在MavenWeb2工程上,点击new –-> Project…
第二步:点击 next
/MavenWeb2/pom.xml文件如下图所示:
与持久层工程创建一样。不在赘述!
点击Next,进行下面的页面
在MavenController中/MavenWeb2/MavenController/src/main/webapp手动新建WEB-INF目录和index.jsp文件,并在目录WEB-INF里添加web.xml文件,如下图所示:
聚合之后的MavenWeb工程的pom文件内容如下:
命令:tomcat7:run 效果截图如下:
详解如下:
用来统一存储所有Maven共享构建的位置就是仓库。
根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging
例如:D:\learn\Java\maven\repository\junit\junit\4.9\junit-4.9.jar
如下图所示:
详解如下:
1、本地仓库
默认在:~/.m2/repository,如果在用户配置中有配置,则以用户配置的地址为准。
每个用户只有一个本地仓库。
2、远程仓库
中央仓库:Maven默认的远程仓库,不包含版权资源(即:不包含有版本的jar包)
http://repo1.maven.org/maven2
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库。
私服图解如下图所示:
nexus是用于maven项目中的仓库的服务器,经常称其为:私服。
它是用来存储和下载一些java依赖文件,通过这些java文件就可以直接从本地进行一系列用来配置maven中获取引用jar文件的服务器,而不需要从中央仓库下载文件。
Nexus是私服的载体,为所有来自中央仓库的构建安装提供本地缓存。
下载网站:http://nexus.sonatype.org/
网站现在变为:https://www.sonatype.com/
下载地址变为:https://www.sonatype.com/download-oss-sonatype
由于官网没有下载war包的链接了,提供个下载的地方:
链接: https://pan.baidu.com/s/1i6C2sHf 密码: 2b5t
安装版本:nexus-2.14.5-02.war
第一步:安装tomcat,我们建议:对于不同的工程,最好给每一个工程配一个专门的tomcat。 第二步:将下载的nexus的war包复制到tomcat下的webapps目录,如下图所示:
第三步:启动tomcat。在 D:\learn\JavaWeb\apache-tomcat\apache-tomcat-9.0.7\bin 目录中找到 startup.bat,运行它。 nexus将在c盘创建sonatype-work目录【C:\Users\当前用户\sonatype-work\nexus】。例如我的:C:\Users\Bruce\sonatype-work\nexus 第四步:nexus的本地目录,如下图所示:
第五步:nexus的目录结构,如下图所示:
indexer 索引目录结构,如下图所示:
storage 存储目录结构,如下图所示:
访问URL: http://localhost:8080/nexus-2.14.5-02/
默认账号: 用户名:admin 密码:admin123
详解如下:
仓库有4种类型:
`group(仓库组)`:一组仓库的集合
`hosted(宿主)`:配置第三方仓库(包括公司内部私服)
proxy(代理):私服会对中央仓库进行代理,用户连接私服,私服自动去中央仓库下载jar包或者插件
virtual(虚拟):兼容Maven1 版本的jar或者插件
Nexus的仓库和仓库组介绍:
3rd party:一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构建
Apache Snapshots:一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构建
Central:代理Maven中央仓库
Central M1 shadow:代理Maven1版本的中央仓库
Codehaus Snapshots:一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构建
Releases:一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件
Snapshots:一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
`Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务`
注意:下面这个界面的设置:
在本地仓库的setting.xml文件中配置如下: setting.xml文件所在位置为:D:\learn\Java\maven\settings.xml
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<!-- 此处配置所有的构建均从私有仓库中下载 *代表所有,也可以写central -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>nexus</name>
<url>http://localhost:8080/nexus-2.14.5-02/content/groups/public/</url>
</mirror>
</mirrors>
截图如下:
第一步:Nexus的访问权限控制 在本地仓库的setting.xml文件中配置如下: setting.xml文件所在位置为:D:\learn\Java\maven\settings.xml
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
第二步:配置pom文件 在需要构建的项目中修改pom文件,添加如下配置代码:
......
<version>0.0.1-SNAPSHOT</version>
......
<!-- 部署构建到Nexus -->
<distributionManagement>
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://localhost:8080/nexus-2.14.5-02/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Internal Snapshots</name>
<url>http://localhost:8080/nexus-2.14.5-02/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
第三步:对需要放到Nexus中的项目执行maven的deploy命令 控制台输出构建成功截图:
Nexus Repository Manager OSS 页面显示截图为:
只在需要构建的项目中修改pom文件的一处地方即可,如下:
......
<version>0.0.1-RELEASE</version>
......
其他操作同上。 Nexus Repository Manager OSS 页面显示截图为:
问题原因:我们在中央仓库索引库中没有我们要找的文件,也即我们没有下载下。
中央仓库索引库的位置:C:\Users\Bruce\sonatype-work\nexus\indexer\central-ctx
解决办法:我们把从网络上下载好的中央仓库索引库文件去覆盖
原来的中央仓库索引库文件。
即现在:JAVA_HOME = D:\learn\Java\JRE\jre1.8.0_161 原来的:JAVA_HOME = D:\learn\Java\JDK\jdk1.8.0_161