《maven实战》笔记
参考文献:https://cloud.tencent.com/developer/article/1336559《maven实战》、apache什么是pom?pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关...
参考文献:https://cloud.tencent.com/developer/article/1336559
《maven实战》、apache
什么是pom?
pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
POM关系:主要为依赖,继承,合成
两个操作
(1) maven的JVM参数的设置方法
Linux:在~/.bash_profile文件中添加
export MAVEN_OPTS="-Xms512m -Xmx1024m"
Windows:如下图
(2) 用户级别的maven配置
把MAVEN_HOME/conf/seettings.xml cp 到 ~/.m2/下,在.m2下的settings.xml中所作的配置就是用户级别的配置,而直接编辑MAVEN_HOME/conf/seettings.xml所作的配置是全局的配置
Maven命令
[mvn -v]: 查看maven版本
[mvn -h]: 查看帮助
[mvn help:system]: 查看java的系统属性和环境变量
[mvn help:active-profiles]: 查看激活的profile
[mvn help:all-profiles]: 列出所有的profile
[mvn help:effective-pom]: 查看项目的所有pom元素(包括父元素中的默认配置)
[mvn clean/compile/test/package/install/deploy]: maven的不同阶段的命令,可以互相组合使用
[mvn archetype:generate]: 创建项目骨架
[mvn dependency:list]: 显示项目中所有已解析依赖
[mvn dependency:tree]: 查看当前项目的依赖树
[mvn dependency:analyze]: 分析项目依赖
[mvn clean install-U]: 强制maven检查更新
[mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Ddetail]: 查看某插件的详细信息
[mvn help:describe -Dplugin=source]: 上一个命令的简写
[mvn help:describe -Dplugin=compile -Dgoal=compile]: 只查看goal相关的信息
[mvn install -Dmaven.test.skip=true]: 构建时跳过测试(不编译测试代码,不运行测试代码)
[mvn package -DskipTests]: 构建时跳过测试(编译测试代码,不运行测试代码)
[mvn clean install -pl module1,module2]: 构建指定的模块
[mvn clean install -pl module -am]: 构建指定模块及其依赖的模块
[mvn clean install -pl module -amd]: 构建指定模块及依赖其的模块
[mvn clean install -rf module]: 在完整的反应堆构建顺序基础上指定从哪个模块开始构建
[mvn clean install -pl module1 -amd -rf module2]: 构建module1以及依赖其的模块,并且从module2开始构建
[mvn clean install -P dev]: 激活id为dev的profile
[mvn clean install -P profile1,profile2]: 激活多个profile
[mvn clean install -Dkey=value]: 设置系统属性值
[mvn test -Dtest=A]: 测试A类
[mvn test -Dtest=A*B]: 测试以A开头B结尾的类
[mvn test -Dtest=A,B]: 测试A类和B类
[mvn test -Dtest=A*B,C]: 测试以A开头B结尾的类以及C类
[mvn test -Dtest -DfailIfNoTests=false]: 即使没有运行测试也不要报错
[mvn cobertura:cobertura]: 生成测试覆盖率报告,文件为target/site/cobertura/index.html
[mvn jetty:run]: 使用jetty-maven-plugin进行测试
[mvn jetty:run -Djetty.port=9999]: 启动jetty服务进行测试,并指定端口号
[mvn cargo:start]: 发布war包到本地服务器
[mvn cargo:deploy]: 发布war包到远程服务器
[mvn release:clean]: 发布新版本前clean
[mvn release:prepare]: 发布新版本前的准备工作
[mvn release:prepare -DautoVersionSubmodules=true]: 子模块与父模块使用相同的版本
[mvn release:rollback]: prepare后如果发现错误,可以回滚
[mvn release:perform]: 发布新版本
[mvn release:branch -DbranchName=0.0.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false]: 创建分支,分支使用新版本,不更新主干(trunk)的代码
[mvn clean deploy -Dgpg.passphrase=passwd]: 发布已经签名的构件
[mvn gpg:sign-and-deploy-file -DgroupId=com.bonc.rdpe -DartifactId=maven001 -Dversion=0.0.1-SNAPSHOT -Dpomfile=target/maven001-0.0.1-SNAPSHOT.pom -Dfile=target/maven001-0.0.1-SNAPSHOT.jar -Durl=http://192.168.138.129:8081/repository/maven-snapshots/ -DrepositoryId=nexus-snapshots]: 发布没有签名的文件并对其签名
[mvn site]: 生成站点
[mvn site:stage -DstagingDirectory=D:\tmp]: 把站点预发布到某个临时文件夹下
上传私服
mvn deploy:deploy-file -DgroupId=com.xy.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=E:\ojdbc14.jar -Durl=http://localhost:9090/nexus-2.2-01/content/repositories/thirdparty/ -DrepositoryId=thirdparty
DgroupId和DartifactId构成了该jar包在pom.xml的坐标,项目就是依靠这两个属性定位。自己起名字也行。
Dfile表示需要上传的jar包的绝对路径。
Durl私服上仓库的位置,打开nexus——>repositories菜单,可以看到该路径。
DrepositoryId服务器的表示id,在nexus的configuration可以看到。
Dversion表示版本信息,怎样得到一个jar包准确的版本呢?
解压该包,会发现一个叫MANIFEST.MF的文件,这个文件就有描述该包的版本信息。
比如Manifest-Version: 1.0可以知道该包的版本了。
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>path/to/maven/repo</localRepository>
<!-- maven是否与用户交互 -->
<interactiveMode>true</interactiveMode>
<!-- 离线模式 -->
<offline>false</offline>
<!-- 设置自定义的解析插件元数据的地址,主要用于得到插件的前缀,简化mvn命令 -->
<pluginGroups>
<!--
当插件的groupId为org.apache.maven.plugins和org.codehaus.mojo时
插件的命令支持简写的形式,例如: mvn help:system
其他插件如果你想要使用简写的命令,需要在这里声明该插件的groupId
这里声明了jetty-maven-plugin的groupId,所以你可以简写该插件的命令,例如: mvn jetty:run
如果不声明,完整的命令是这样的: mvn jetty:run -Dplugin=org.mortbay.jetty:jetty-maven-plugin:8.1.16.v20140903
-->
<pluginGroup>org.eclipse.jetty</pluginGroup>
<pluginGroup>com.your.plugins</pluginGroup>
</pluginGroups>
<!-- 设置HTTP代理 -->
<proxies>
<proxy>
<id>dev3-proxy</id>
<active>true</active>
<protocol>http</protocol>
<username>root</username>
<password>root</password>
<host>172.16.13.185</host>
<port>9999</port>
<nonProxyHosts>https://repo.maven.apache.org/maven2|*.google.com</nonProxyHosts>
</proxy>
</proxies>
<!-- 配置仓库的认证信息 -->
<servers>
<server>
<id>nexus-releases</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
<server>
<id>nexus-snapshot</id>
<username>hadoop</username>
<password>hadoop</password>
</server>
</servers>
<mirrors>
<!-- 配置远程仓库的镜像:这是一个私服 -->
<mirror>
<id>Public Repositories</id>
<name>Public Repositories</name>
<!-- * 代表这个私服可以作为所有远程仓库的镜像 -->
<mirrorOf>*</mirrorOf>
<!--
<mirrorOf>external:*</mirrorOf> : 匹配所有不在本机上的远程仓库
<mirrorOf>repo1,repo2</mirrorOf> : 只匹配repo1和repo2这两个仓库
<mirrorOf>*,!repo1</mirrorOf> : 匹配除了repo1之外的所有远程仓库
-->
<url>http://172.16.13.185:9000/nexus/content/groups/public/</url>
</mirror>
<!-- 阿里云的镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- 自定义的配置 -->
<profiles>
<!-- 激活方式1: 默认激活 -->
<!-- 设置maven编译时的jdk版本 -->
<profile>
<id>jdk-1.8</id>
<activation>
<!--默认为激活状态-->
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<!-- 激活方式2: 在activeProfiles中激活 -->
<!-- 这是一个自定义的数据库配置 -->
<profile>
<id>profile1</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.138.101:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
</profile>
<!--激活方式3: 当系统属性的值为指定值时激活-->
<!--
下面这个profile在系统属性(one.of.system.property)为指定值(expected.value)时被激活
你可以在命令行设置系统属性值: mvn clean install -Done.of.system.property=expected.value
-->
<profile>
<id>profile2</id>
<activation>
<property>
<name>one.of.system.property</name>
<value>expected.value</value>
</property>
</activation>
<properties>
<!-- ...... -->
</properties>
</profile>
<!-- 激活方式4: 根据操作系统的环境激活 -->
<profile>
<id>profile3</id>
<activation>
<os>
<name>Windows 10</name>
<family>Windows</family>
<arch>amd64</arch>
<version>10.0</version>
</os>
</activation>
<properties>
<!-- ...... -->
</properties>
</profile>
<!-- 激活方式5: 基于文件存在与否激活: x.properties存在激活,y.properties不存在激活 -->
<profile>
<id>profile4</id>
<activation>
<file>
<exists>x.properties</exists>
<missing>y.properties</missing>
</file>
</activation>
<properties>
<!-- ...... -->
</properties>
</profile>
<!-- 说明:
1. 如果有任意一个profile通过非默认的方式激活了,那么默认激活的profile就会失效
2. 在settings.xml中设置的profile不允许修改大部分pom元素,比如声明依赖或修改插件,而在项目中pom.xml中的profile中,可以修改pom原始的配置,比如maven的那些默认路径配置
-->
</profiles>
<!-- 激活已经配置的profile -->
<activeProfiles>
<activeProfile>dev</activeProfile>
</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.0</modelVersion>
<groupId>com.bonc.rdpe</groupId>
<artifactId>maven001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 打包类型为jar,默认为jar,web项目应该是war,其他还有: maven-plugin/ear/pom等 -->
<packaging>jar</packaging>
<!--附属构件,不能直接定义 -->
<classifier></classifier>
<name>maven001</name>
<!-- 自定义maven属性 -->
<properties>
<hadoop.version>2.7.6</hadoop.version>
<junit.version>4.7</junit.version>
<spark.version>2.3.0</spark.version>
<springframework.version>2.5.6</springframework.version>
</properties>
<repositories>
<!-- maven中央仓库,不需要配置,这里是为了说明各配置的功能 -->
<repository>
<!-- id值必须唯一,否则会覆盖 -->
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<releases>
<!-- 下载发布版构件 -->
<enabled>true</enabled>
<!--
Maven 从远程仓库更新的频率
never(从不)
daily(每天一次,默认)
always(每次构建都检查更新)
interval:X(每隔X分钟检查一次,X为任意整数)
-->
<updatePolicy>never</updatePolicy>
<!--
检验文件的策略,如果校验失败:
warn(默认):输出警告信息
fail: 构建失败)
ignore: 忽略
-->
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<!-- 不从中央仓库下载快照版本的构件 -->
<enabled>false</enabled>
</snapshots>
</repository>
<!-- JBOSS Maven 仓库 -->
</repositories>
<!-- 配置下载插件的远程仓库,各配置和repositories中的意义是一样的 -->
<pluginRepositories>
<pluginRepository>
<id></id>
<name></name>
<url></url>
<layout></layout>
<releases>
<updatePolicy></updatePolicy>
</releases>
<snapshots>
<enabled></enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!-- 项目输出的构件部署的远程仓库 -->
<distributionManagement>
<!-- 发布版的构件部署的仓库 -->
<repository>
<id>dev3-repository</id>
<name>Dev3 Release Repository</name>
<url>http://172.16.13.185:9000/nexus/content/repositories/releases/</url>
</repository>
<!-- 快照版的构件部署的仓库 -->
<snapshotRepository>
<id>dev3-snapshots-repository</id>
<name>Dev3 Snapshot Repository</name>
<url>http://172.16.13.185:9000/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<!-- 在这里声明的依赖会被子模块继承,但是,不是声明了就一定会被继承,如果子模块不引入这些依赖,就不会强制加给子模块 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 合并其他maven工程中的dependencyManagement下定义的依赖到本模块的dependencyManagement下 -->
<dependency>
<groupId>com.bonc.rdpe</groupId>
<artifactId>account-xxx</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--import 只能用在dependencyManagement中,且目标POM的packaging必须为pom,这里的type也只能为pom-->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 本模块使用的构件 -->
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
<!-- 依赖类型,默认是jar,而且绝大部分为jar,不需要配置 -->
<type>jar</type>
<!-- 依赖范围,默认compile,可以是test/provided/runtime/system,当为system时需要systemPath指定jar包路径-->
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/rt.jar</systemPath>
<!-- 是否可选,默认false,如果是ture,则当其他项目依赖此项目时,其他项目不会依赖这个jar包,不建议在项目中使用可选依赖 -->
<optional>true</optional>
<exclusions>
<!--排除掉spark-sql_2.11-2.3.0.jar依赖的hadoop-client-x.x.x.jar -->
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 排除掉spark-sql依赖的jar后,需要手动添加项目需要的版本的hadoop-client包 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
<!-- maven工程需要的额外配置 -->
<!--
以下例子为: 配置了两套不同的数据库环境
开发人员和测试人员使用时可以根据自己的角色激活对应profile
-->
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.138.101:3306/dev</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.138.101:3306/test</db.url>
<db.username>test</db.username>
<db.password>test-pwd</db.password>
</properties>
</profile>
</profiles>
<build>
<!-- 在这里声明的插件会被子模块继承 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- 以下是一些maven的默认路径配置,你可以自定义,但不建议 -->
<!-- 主输出目录 -->
<directory>${project.basedir}/target</directory>
<!-- 主代码输出目录 -->
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<!-- 最终构建的名称格式 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 测试代码输出目录 -->
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<!-- 主源码目录 -->
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<!-- 脚本源码目录 -->
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<!-- 测试源码目录 -->
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<!-- 主资源目录 -->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<!-- 开启资源过滤,作用: 开启后,资源目录下的配置为文件中就可以识别profile中定义的maven属性 -->
<filtering>true</filtering>
</resource>
</resources>
<!-- 测试资源目录 -->
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<!-- maven编译插件 -->
<plugin>
<!-- 如果插件的groupId=org.apache.maven.plugins,可以省略 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 如果没有设置插件版本,maven会获取最新的发布版 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<!-- 是否跳过测试代码的编译,默认为false,不建议设置为true -->
<skip>true</skip>
</configuration>
</plugin>
<!-- maven源码生成插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<!-- 对于自定义绑定的插件,建议手动指定一个非快照的版本 -->
<version>3.0.1</version>
<executions>
<!-- 每个execution用来配置一个任务 -->
<execution>
<id>attach-source</id>
<!-- 绑定到default生命周期的verify阶段 -->
<phase>verify</phase>
<!-- 任务目标 -->
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- maven打包插件: 相对于默认的maven-jar-plugin,这个插件打的包是可执行的 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!--设置主类-->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.bonc.rdpe.maven001.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<!-- maven默认的打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<!-- 设置打包的时候把测试代码也打包,默认为jar(即只打包主代码) -->
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- web项目打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<webResources>
<webResource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
<!-- 所有的css文件和js文件或被打到war包中 -->
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</webResource>
</webResources>
</configuration>
</plugin>
<!-- maven测试插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<!-- 修改了测试报告的存放为位置,默认为${project.build.directory}/surefire-reports -->
<reportsDirectory>${project.build.directory} est-reports</reportsDirectory>
<!-- 是否跳过测试代码的运行,默认为false,不建议设置为true -->
<skipTests>true</skipTests>
<!--
默认情况下,maven会测试以Test开头和结尾、以TestCase结尾的类
你可以设置让maven测试不符合测试类命名规范的类
**/*Tests.java: 测试任意路径下的以Tests结尾的类
-->
<includes>
<include>**/*Tests.java</include>
</includes>
<!--
当然,也可以设置排除掉一些测试类
**/*ServiceTest.java: 任意路径下的ServiceTest结尾的类都不会测试
**/ArrayTest.java: 任意路径下的ArrayTest这个类都不会被测试
-->
<excludes>
<exclude>**/*ServiceTest.java</exclude>
<exclude>**/ArrayTest.java</exclude>
</excludes>
<!--
可以在外部自定义的xml文件来设置测试哪些类,这里的配置用来声明该外部文件的位置
这个功能需要使用TestNG这个jar包,而不是JUnit
-->
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
<!--
@Test方法可以声明其属于哪个组,这个设置测试哪些组中的方法,例如
@Test(groups = {"group1"}) public void testXXX() {...}
这个功能需要使用TestNG这个jar包,而不是JUnit
-->
<groups>group1</groups>
</configuration>
</plugin>
</plugins>
</build>
</project>
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)