首页 > 其他 > 详细

maven nexus

时间:2019-02-05 20:24:34      阅读:135      评论:0      收藏:0      [点我收藏+]
  • Maven基本元素
<?xml version="1.0" encoding="UTF-8"?>
<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.ourteam</groupId>
    <artifactId>helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

groupId        定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联
artifactId    定义了当前Maven项目在组中唯一的ID
version        指定了项目当前的版本

  • 常用命令

  验证(validate) - 验证项目是否正确,所有必要的信息可用

  编译(compile) - 编译项目的源代码

  测试(test) - 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署

  打包(package) - 采用编译的代码,并以其可分配格式(如JAR)进行打包。

  验证(verify) - 对集成测试的结果执行任何检查,以确保满足质量标准

  安装(install) - 将软件包安装到本地存储库中,用作本地其他项目的依赖项

  部署(deploy) - 在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。

  • 完整生命周期
  1. 预清洁(pre-clean)     执行实际项目清理之前所需的流程
  2. 清洁(clean)     删除以前构建生成的所有文件
  3. 后清洁(post-clean)     执行完成项目清理所需的流程
  4. 验证(validate)     验证项目是正确的,所有必要的信息可用。
  5. 初始化(initialize)     初始化构建状态,例如设置属性或创建目录。
  6. 产生来源(generate-sources)     生成包含在编译中的任何源代码。
  7. 流程源(process-sources)     处理源代码,例如过滤任何值。
  8. 生成资源(generate-resources)     生成包含在包中的资源。
  9. 流程资源(process-resources)     将资源复制并处理到目标目录中,准备打包。
  10. 编译(compile)     编译项目的源代码。
  11. 工艺类(process-classes)     从编译后处理生成的文件,例如对Java类进行字节码增强。
  12. 生成测试来源(generate-test-sources)     生成包含在编译中的任何测试源代码。
  13. 流程测试来源(process-test-sources)     处理测试源代码,例如过滤任何值。
  14. 生成测试资源(generate-test-resources)     创建测试资源。
  15. 流程测试资源(process-test-resources)     将资源复制并处理到测试目标目录中。
  16. 测试编译(test-compile)     将测试源代码编译到测试目标目录中
  17. 流程检验类(process-test-classes)     从测试编译中处理生成的文件,例如对Java类进行字节码增强。对于Maven 2.0.5及以上版本。
  18. 测试(test)     使用合适的单元测试框架运行测试。这些测试不应该要求代码被打包或部署。
  19. 制备包(prepare-package)     在实际包装之前,执行必要的准备包装的操作。这通常会导致打包的处理版本的包。(Maven 2.1及以上)
  20. 打包(package)     采取编译的代码,并以其可分发的格式(如JAR)进行打包。
  21. 预集成测试(pre-integration-test)     在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境等。
  22. 集成测试(integration-test)     如果需要,可以将该包过程并部署到可以运行集成测试的环境中。
  23. 整合后的测试(post-integration-test)     执行集成测试后执行所需的操作。这可能包括清理环境。
  24. 校验(verify)     运行任何检查以验证包装是否有效并符合质量标准。
  25. 安装(install)     将软件包安装到本地存储库中,以作为本地其他项目的依赖关系。
  26. 部署(deploy)     在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
  27. 预网站(pre-site)     在实际的项目现场生成之前执行所需的进程
  28. 网站(site)     生成项目的站点文档
  29. 后网站(post-site)     执行完成站点生成所需的进程,并准备站点部署
  30. 网站部署(site-deploy)     将生成的站点文档部署到指定的Web服务器

备注:

dependency:copy-dependencies这样的形式最标准的官方说法:左边dependency为插件,右边copy-dependencies为插件的goal

跳过测试:mvn clean package -Dmaven.test.skip=true

  • maven的依赖、聚合、继承

    依赖

我们项目中依赖的 Jar 包可以通过依赖的方式引入,通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。通过控制依赖的范围,可以指定该依赖在什么阶段有效。Maven 的几种依赖范围:

compile(默认): 编译范围,编译和打包都会依赖。
provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar
runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar
test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar
system:表示由系统中CLASSPATH指定。编译时依赖,不会打包进去。配合<systemPath> 一起使用。示例:java.home下的tool.jar

system 除了可以用于引入系统classpath 中包,也可以用于引入系统非maven  收录的第三方Jar,做法是将第三方Jar放置在 项目的 lib 目录下,然后配置 相对路径,但因system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用。当然推荐大家还是通过 将第三方Jar手动install 到仓库。

<!-- system 的通常使用方式-->
<dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>${java.version}</version>
          <scope>system</scope>
          <optional>true</optional>
          <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,也可以用 <optional> 去除这种依赖的传递
 <dependency>
 <groupId>commons-logging</groupId>
 <artifactId>commons-logging</artifactId>
 <version>1.1.1</version>
 <optional>true<optional>
 </dependency>

假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性,那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖,exclusions 可以包含一个或者多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。

    <dependency>    
         <groupId>org.springframework</groupId>  
         <artifactId>spring-core</artifactId>  
         <exclusions>  
               <exclusion>      
                    <groupId>commons-logging</groupId>          
                    <artifactId>commons-logging</artifactId>  
               </exclusion>  
         </exclusions>  
    </dependency>

    聚合

现实中一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。如清单 7,其中 <module></module> 中间的内容为子模块工程名的相对路径。
清单 7. 聚合

  <modules>    
 <module>../com.dugeng.project1</module>
 <module>../com.dugeng.project2</module>
  </modules>

父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java 目录。Maven 会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。

    继承

继承是指子工程直接继承父工程 当中的属性、依赖、插件等配置,避免重复配置。

例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块,那么我们在 project1 和 2 中用如下代码声明父子关系,

 <parent>
  <groupId>com.dugeng.mavenproject</groupId>
  <artifactId>com.dugeng.parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <relativePath>../com.dugeng.parent/pom.xml</relativePath>
 </parent>

由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。

聚合和继承存在一些共性和潜在的联系,在实际的应用中,经常将聚合模块的父模块和继承的父模块定义为同一个。

  • 项目属性

通过 <properties> 配置 属性参数,可以简化配置。
<!-- 配置proName属性 -->
<properties>
    <proName>ddd</proName>
</properties>
<!-- 引用方式 -->
${proName}
maven 默认的属性
${basedir} 项目根目录  
${version}表示项目版本;  
${project.basedir}同${basedir};  
${project.version}表示项目版本,与${version}相同;  
${project.build.directory} 构建目录,缺省为target  
${project.build.sourceEncoding}表示主源码的编码格式;  
${project.build.sourceDirectory}表示主源码路径;  
${project.build.finalName}表示输出文件名称;  
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes

 

  • 插件

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.6</version>  
    <executions>  
        <execution>  
            <id>copy-dependencies</id>  

                <!-- 表示是在什么阶段 --> 
            <phase>compile</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
            <configuration>  
                <!-- ${project.build.directory}为Maven内置变量,缺省为target -->  
                <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                <!-- 表示是否不包含间接依赖的包 -->  
                <excludeTransitive>false</excludeTransitive>  
                <!-- 表示复制的jar文件去掉版本信息 -->  
                <stripVersion>true</stripVersion>  
            </configuration>  
        </execution>  
    </executions>  
</plugin> 

 

  • phase:指定哪个阶段

mvn package这个命令会运行以下6个步骤(左边这列是步骤名,同时也是phase的名字,右边是对应的goal):

Phase              plugin:goal
process-resources          resources:resources
compile               compiler:compile
process-test-resources      resources:testResources
test-compile             compiler:testCompile
test              surefire:test
package            jar:jar
install             install:install
deploy              deploy:deploy

  • goal:做什么
  • settings.xml

<?xml version="1.0" encoding="UTF-8"?>

<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">
  <!-- 本地仓库路径,默认路径为${user.home}/.m2/repository。为了避免重装系统而被删除,可在maven文件夹下创建个repository文件夹,将该节点改为该repository文件夹的路径即可 -->
  <localRepository>${user.home}/.m2/repository</localRepository>
 <!-- 互动模式,默认值为true。该值使用默认值即可,无需更改 -->
  <interactiveMode>true</interactiveMode>
<!-- 离线模式,默认值为false。当因为各种原因无法与远程仓库连接时,可将该值修改为true  -->
  <offline>false</offline>
<!-- 插件组,内部由n个pluginGroup节点组成,默认自带了org.apache.maven.plugins和org.codehaus.mojo。若有特殊的需求是可进行扩展 -->
  <pluginGroups></pluginGroups>
<!-- 代理设置,内部由n个proxy节点组成。部分公司出于安全考虑会需要员工通过代理才可上网,这时,就需配置该节点的参数了。 -->
  <proxies></proxies>
<!-- 服务器,内部由n个server节点组成。有2种配置方式:一种是通过id匹配,username和password进行认证登录;另一种是通过id匹配指向一个privateKey(私钥)和一个passphrase -->
  <servers></servers>
<!-- 镜像仓库,内部由n个mirror节点组成。用来代替中央仓库(Maven默认的远程仓库),用于提升传输速度。因此此处可以添加一个镜像,以提升我们下载的速度 -->
  <mirrors></mirrors>
<!-- 用于覆盖在一个POM或者profiles.xml文件中的任何相同id的profiles节点 -->
  <profiles></profiles>
<!-- activeProfile值为profile中所定义的id,在这里定义的activeProfile总是被激活 -->
  <activeProfiles></activeProfiles>
</settings>

  • dependencyManagement
    • dependencies

      即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

    • dependencyManagement

      只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

  • nexus
    • 仓库介绍

    Group:分组仓库

    Hosted:私有仓库,用于存储我们的自己内部生成的jar文件      

      3rd party:第三方仓库

      Releases:私有发布版本仓库

      Snapshots:私有 快照版本仓库

    Proxy:公网上发布的jar,例如:spring/struts

      Apache Snapshots:apache 快照仓库

      Central: maven 中央仓库

    • 本地远程仓库配置

 <servers>

<!-- 用户发布使用 -->
      <server>
          <id>nexus-snapshot</id>
          <username>deployment</username>
          <password>deployment123</password>
        </server>
         <server>
          <id>nexus-release</id>
          <username>deployment</username>
          <password>deployment123</password>
        </server>
  </servers>
  <mirrors>

<!-- 配置了镜像,所有都指向nexus -->
    <mirror>
        <id>nexus</id>
        <name>nexus</name>
        <mirrorOf>*</mirrorOf>
        <url>http://192.168.31.135:8081/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
        <id>Central</id>  
        <repositories>  
            <repository>
                <id>nexus-release</id>                     
                <name>Nexus Release Snapshot Repository</name>                     
                <url>http://192.168.31.135:8081/nexus/content/repositories/releases/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
 
            <repository>
                <id>nexus-snapshots</id>
                <url>http://192.168.31.135:8081/nexus/content/repositories/snapshots/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>                    
            </repository>
        </repositories>  
        <pluginRepositories>
            <pluginRepository>
                <id>nexus-release</id>                     
                <url>http://192.168.31.135:8081/nexus/content/repositories/releases/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>nexus-snapshots</id>
                <url>http://192.168.31.135:8081/nexus/content/repositories/snapshots/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>Central</activeProfile>     
  </activeProfiles>

 

    • nexus 配置

Remote Storage Location 指向阿里云镜像,提高下载速度 http://maven.aliyun.com/nexus/content/groups/public/

Download Remote Indexes 设置为true

    • nexus 工程说明

./nexus start 之后,会在 sonatype-work 创建nexus 工作目录,可以在/sonatype-work/nexus/storage目录中知晓最终下载的路径是哪个,是否确实走的阿里云镜像

maven nexus

原文:https://www.cnblogs.com/Pibaosi/p/10352290.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!