设为首页 收藏本站
查看: 1064|回复: 0

[经验分享] Maven学习,使用笔记

[复制链接]

尚未签到

发表于 2017-3-1 06:36:16 | 显示全部楼层 |阅读模式
Maven使用笔记
  使用Maven有一段时间了,用它做过几个项目的构建工具,感觉还是非常不错的,省去很多不必要的麻烦,比如jar包的依赖管理,升级等,还可以处理一些繁杂的事务,比如简单的代码生成,数据导入导出等。当然这里有一定的学习成本!
  本文就一些常规使用做了介绍,包括一些需要注意的地方和本人常人的配置插件等。
  特别说明,由于settings.xml是针对全局或个人的设置,不能随项目走,所以本文直接无视settings.xml的配置!

Maven一般目录结构

.
pom.xml
src
|-main
|-java
|-resources
|-webapp
|-test
|-java
|-resources
target

Maven属性设置

项目属性配置
  加*项是建项目必要属性

属性名称描述



groupId *
当前项目隶属的上级项目ID,一般是系列相关子项目的组ID,如:org.springframework


artifactId *
当前项目模块ID,一般为实际项目ID,如:spring-web


version *
此项目模块的版本


packaging
项目类型,jar或war,默认为jar


name
项目名称,如果跟IDE配合使用时IDE会识别此名称


description
项目描述


organization
所属组织


licenses
许可协议


mailingLists
邮件列表


developers
开发者


contributors
贡献者


issueManagement
问题追踪系统


ciManagement
持续集成系统


scm
版本控制系统

POM一般属性变量

名称说明



${basedir}
项目根目录,包含pom.xml文件的目录


${version}
项目的版本


${pom.build.sourceDirectory}
项目的主源码目录,默认为:src/main/java


${pom.build.testSourceDiretory}
项目的测试源码目录, 默认为:src/test/java


${pom.build.directory}
项目构建输出目录,默认为target


${pom.outputDirectory}
项目主代码编译输出目录,默认为: target/classess


${pom.testOutputDirectory}
项目主代码编译输出目录,默认为: target/test-classess


${pom.groupId}
项目的groupId


${pom.artifactId}
项目的artifactId


${pom.version}
项目的版本


${pom.build.finalName}
项目打包输出文件的名称,默认为${pom.artifactId}-${pom.version}
  以上build属性可通过pom.xml文件中build结点指定如:

<build>
<directory>${pom.basedir}/target</directory>
<outputDirectory>${pom.build.directory}/classes</outputDirectory>
<finalName>${pom.artifactId}-${pom.version}</finalName>
<testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${pom.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${pom.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${pom.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${pom.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<build>

  更多内容:MavenPropertiesGuide

自定义属性变量
  在根结点增加:

<projecties>
<spring.version>3.1-RELEASE</spring.version>
<hibernate.version>4.2-FINAL</hibernate.version>        
<!-- 使用${spring.version}读取 -->
</projecties>

资源文件使用Maven变量
  如有文件 src/main/resources/application.properties:

# application.properties
application.name=${pom.name}
application.version=${pom.version}

  执行命令:mvn process-resources maven会给其中的亦是赋值:

# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT

  更多内容:http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files

Maven依赖管理

自定义源地址
  如在maven的中央仓库中没有你要用的jar包,通过自定义源解决:

<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

排除依赖和子项目依赖

<dependency>
<!-- 子项目,被依赖的子项目必须经过maven的install安装,不然maven还是找不到! -->
<groupId>bgonline</groupId>
<artifactId>foundation</artifactId>
<version>1.0.0</version>
<!-- 排除 -->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>

本地JAR包安装

##安装jar文件
call mvn install:install-file -Dfile=xxx-1.0.0.jar -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=jar
##安装pom文件
call mvn install:install-file -Dfile=xxx-1.0.0.pom.xml -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=pom

Maven插件管理

添加插件:

<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
</plugins>
</pluginManagement>
</build>

自定义插件源

<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>

常用插件

名称说明



jetty-maven-plugin
jetty插件,轻量级web容器,推荐阶段开发使用


maven-antrun-plugin
跑ant命令插件,常用来做文件处理,sql执行等,基本包括ant所有功能


native2ascii-maven-plugin
转ascii,如多语言配置文件的中文转成ascii码解决乱码问题


versions-maven-plugin
检测所有依赖的更新情况


maven-surefire-plugin
生成测试报告,配全Testng,指定单元测试的配置文件,进行分组、分类、分包测试,可参考Testng文档说明
  更多内容:plugins

Maven Profile使用
  有时候会根据不同的情况执行不现的构建命令,这就用到maven的profile,profile可以直接写在pom.xml里也可以被提出到独立文件profiles.xml同pom.xml同级目录或settings.xml,但Maven3只支持写在pom.xml文件里,why?!
  1.使用profile+ant执行sql做数据初始化:

<profile>
<id>INIT-DB-DATA</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<target>
<sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue">
<classpath refid="maven.runtime.classpath"/>
<transaction src="src/main/resources/sql/${jdbc.direct}/schema.sql"/>
</sql>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>

  2.使用maven profile ant hibernate-tools生成类bean:

<profile>
<id>Gen-Java-Bean</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<target>
<echo message="生成表ENTITY类……"/>
<property name="toolsDir" value="src/test/tools"/>
<!-- 这里需要指定hibernatetool相关jar包,自行下载 -->
<path id="lib.class.path">
<fileset dir="${toolsDir}/lib">
<include name="*.jar"/>
</fileset>
</path>
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.class.path"/>
<hibernatetool destdir="${toolsDir}/lib/build">
<jdbcconfiguration propertyfile="${toolsDir}/lib/cfg/jdbc.properties" revengfile="${toolsDir}/lib/cfg/hibernate.reveng.xml"/>
<!-- 指定hibernatetools生成bean的模板,根据自己需要定制生成内容,用的freemarker引擎,在hibernate-tools.jar包里有默认模板 -->
<hbmtemplate
destdir="${toolsDir}/lib/build"
templatepath="${basedir}/${toolsDir}/lib/hbmtemplates/"
templateprefix="/hbmtemplates"
filepattern="{class-name}Entity.java"
template="pojo2/Pojo.ftl">
<property key="ejb3" value="false"/>
<property key="jdk5" value="false"/>
</hbmtemplate>
<!-- 或者直接 <hbm2java/> 只是这样使用的是默认模板 -->
</hibernatetool>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>

  更多内容:profiles.html

Maven多项目配置
  创建如下目录结构:

+- pom.xml 父
+- my-app
| +- pom.xml 子1,jar类型
| +- src
|   +- main
|     +- java
+- my-webapp
| +- pom.xml 子2,webapp类型
| +- src
|   +- main
|     +- webapp

  父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.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>

  注:一些项目全局属性可在此pom文件中设置,比如项目信息,所有依赖等,这样在子项目就不用重复申明,如依赖可省掉版本号,直接使用父pom中的版本,这样可以统一管理所有项目的依赖版本。
  子1的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">
<groupId>com.mycompany.app</groupId>
<artifactId>app-jar</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...

  子2的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">
<groupId>com.mycompany.app</groupId>
<artifactId>app-war</artifactId>
<packaging>war</packaging>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...

  子2需要依赖子1,配置如下:

...
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>

  最后在父pom所在目录执行mvn clean install命令,jar包会被安装本地仓库,war会被发布到target目录。

Maven创建项目

创建java项目

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.mycompany.app \
-DartifactId=my-app

  生成的目录结构:

my-app
|-- pom.xml
`-- src
|-- main
|   `-- java
|       `-- com
|           `-- mycompany
|               `-- app
|                   `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java

创建java webapp

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp

  生成的目录结构:

+- my-webapp
| +- pom.xml
| +- src
|   +- main
|     +- resources
|     +- webapp
|       +- index.jsp
|       +- WEB-INF
|         +- web.xml

  之后根据需要在main下创建java目录,在src创建test目录。

生命周期常用命令


  • 编译 mvn compile,编译测试 mvn test-compile,不执行测试,仅编译
  • 测试 mvn test,执行测试
  • 打包 mvn package,java项目打成jar包,web项目打包war包
  • 安装 mvn install,将自己java项目生成的jar包安装到本地仓库
  • 站点 mvn site,根据pom.xml配置信息生成项目相关的站点在target/site
  • 清除 mvn clean,将target目录下build后的内容删除
  更多内容:lifecycle.html

更多Maven参考
  POM详细说明文档 :http://maven.apache.org/pom.html
POM说明3.0.5版:http://maven.apache.org/ref/3.0.5/maven-model/maven.html
Maven-3.0.5文档:http://maven.apache.org/ref/3.0.5/
maven.apache.org:http://maven.apache.org/guides/getting-started/
docs.codehaus.org:http://docs.codehaus.org/display/MAVENUSER

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348480-1-1.html 上篇帖子: 招聘网站开发后端(Java)、前端、数据库等各类人才 下篇帖子: dfs.datanode.max.xcievers参数导致hbase集群报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表