Maven 学习

来源:互联网 发布:mongodb java api 编辑:程序博客网 时间:2024/06/08 10:18

  • Maven
    • 搜索jar包
    • 特点
      • jar包依赖
      • 项目坐标
        • jar 包依赖
      • 测试驱动
  • Eclipse中使用Maven
    • Eclipse中创建Maven工程
    • Eclipse中Maven常用的命令
  • Maven内置属性
    • Maven属性
    • 资源过滤
    • Maven Profile
      • 激活Profile
  • maven引入自定义jar的三种方式
    • 引入方式一
    • 引入方式二推荐
    • 引入方式三
    • 创建jar文件

参考:
maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程
maven内置属性(${} properties)
maven eclipse基本知识

Maven

官网
Maven是一个用于项目构建的工具,通过它便捷的管理项目的生命周期。即项目的jar包依赖,开发,测试,发布打包。

Maven 哲学 (Maven 开发者的)大概翻译(参考):

Maven 被大部分人认为只是一个编译工具。许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具。但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具。maven是一个完全不同于ant的产物。ant只是一个简单的工具箱而maven是模式的应用程序,这些模式完成一个框架,它有可视化、重用性、可维护性、扩展性等特点。
没有这些特征,多人高效的工作在一个项目上是不可能的。没有可视化,个人难以知道其它人完成了什么,有用的代码可能无法重用。当代码无法重用时,可维护的系统是很难被创建的。当每个人都在试图弄明白组成项目的所有点点滴滴是什么的时候,很少有人能够从整体去理解这个项目。随着团队成员之间失落情绪达到一定的程度,共享知识会逐渐衰退,最终以粮仓效应结束。当过程不能以相同方式进行时,这是一种自然的结果。
Maven诞生在apache项目非常渴望以统一的方式进行时。因此开发者能够很容易在项目间移动,只需要明白其中一个项目是如何工作的,就能够理解其它项目是如何工作的。如果一个开发人员花时间理解了一个项目是如何构建的,当他进行下一个项目时,他不必再经历这一过程。相同的想法可以扩展到测试,文档生成,报告生成,部署。所有项目共享相同的特征,maven试图在项目管理中固定它的常用方法。所有项目都需要构建,测试,打包,文档化,部署。当然,在上面的每一个步骤中都有无尽的变化,但是这些变化发生在预定路径的范围内,maven试图以清晰的方式展现给每一个人。使路径清晰最简单的方式就是提供一系列模式给参与项目的每一个人共享。

搜索jar包

MVNrepository(推荐:速度快)
The Central Repository
OutOfMemory 的中央仓库(速度快)
OSChina 的中央仓库(不稳定)

特点

jar包依赖

Maven 最突出的特点,使用 Maven 后,无需单独下载 jar 包,只需在 pom.xml 文件里配置 jar 包的依赖关系,Maven 就会自动将 jar 包下载并应用到我们的项目里了。另外 Maven 对 jar 包版本号的精准控制还能避免 jar 包版本不一致情况的发生。
同时,其他人开发或者使用此工程时,也无需拷贝 jar 包,只需要复制这个 pom.xml 就可以自动下载这些jar包了。

项目坐标

Maven 通过特定的标识来定义项目名称,这样既可以唯一的匹配其他的jar包,也可以通过发布,使别人能使用自己的发布产品。这个标识就被叫做坐标(其实就是简单的xml):

<groupId>com.test</groupId><artifactId>maventest</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>maventest</name><url>http://maven.apache.org</url>

参数
groupId:项目名称。有些项目并不是一个jar包构成的,而是由很多的jar包组成的。因此这个groupId就是整个项目的名称。
artifactId:包名称
version:版本号
packaging:包的类型,一般都是jar,也可以是war之类的。如果不填,默认就是jar
name和url,一个是名称,一个是maven的地址。

jar 包的命名规则:artifactId-version[-classifier].packaging
如上就是:maventest-0.0.1-SNAPSHOT.jar

classifier 是可选的,但是有的项目可能还需要导出附属的一些文件,如javadoc,source等等,那么这个地方就需要配置一个字符串。一般都是JDKXXX之类的。

jar 包依赖

<properties>    <junit.version>4.12</junit.version></properties><dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>${junit.version}</version>    <scope>test</scope></dependency>

测试驱动

Maven是测试驱动的开发思路,因此工程创建初期,就包含两个文件夹,main和test。一个用于放置开发的java文件,一个用于写test单元测试。这样每次开发的时候,提前设计单元测试,就能帮助减少BUG。

相关书籍:《Maven权威指南》《Maven实战》等

Eclipse中使用Maven

Eclipse中创建Maven工程

新建工程
1、新建——Maven——Maven Project
2、选择默认的工程位置:勾选Use default workspace location
3、创建普通Maven工程选择 maven-archetype-quickstart,创建web 工程选择 maven-archetype-webapp
4、填写相关的groupId artifactId version等信息即可。

Eclipse中Maven常用的命令

点击Run As就可以发现几个Maven的命令:

  • Maven Build:编译Maven工程,执行命令后会在target文件夹中的classes中生成对应的class文件。
  • Maven Clean:删除target文件夹,即删除生成的package包以及class等文件。
  • Maven package:把jar打到本项目的target下。
  • Maven Test:先自动进行编译,再运行所有的测试用例。
  • Maven install:把target下的jar安装(发布)到本地仓库。

:Maven 3.3以上版本是自动编译的,无需再单独执行Maven Build或Maven Test了。

Maven内置属性

Maven内置了三大特性:属性、Profile和资源过滤来支持构建的灵活性。

Maven属性

六种类型:

  • 内置属性${basedir}项目根目录(包含pom.xml文件的目录);${version}项目版本。
  • POM属性:pom中对应元素的值。例如${project.artifactId}对应了<project><artifactId>元素的值,常用的POM属性包括:
    ${project.build.sourceDirectory}项目的主源码目录,默认为src/main/java/
    ${project.build.testSourceDirectory}项目的测试源码目录,默认为/src/test/java/
    ${project.build.directory}项目构建输出目录,默认为target/
    ${project.build.outputDirectory}项目主代码编译输出目录,默认为target/classes/
    ${project.build.testOutputDirectory}项目测试代码编译输出目录,默认为target/testclasses/
    ${project.xxx} 当前pom文件的任意节点的内容,如${project.basedir}项目根目录,与${basedir}等价;${project.groupId}项目的groupId;${project.artifactId}项目的artifactId;${project.packaging} 打包类型(缺省为jar);${project.version}项目的version,与${version}等价;
    ${project.build.finalName}项目打包输出文件的名称,默认为${project.artifactId}${project.version}
  • 自定义属性:在pom.xml中<properties>元素下自定义的Maven属性
  • Settings属性:与POM属性同理。如${settings.localRepository}指向用户本地仓库的地址
  • Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过命令行 mvn help:system 查看所有的Java系统属性
  • 环境变量属性:所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。

:使用 mvn 命令查看系统属性mvn help:system

资源过滤

默认情况下,Maven属性只有在POM中才会被解析。资源过滤就是指让Maven属性在资源文件(src/main/resources、src/test/resources)中也能被解析。
在POM中添加下面的配置便可以开启资源过滤

<build>    <resources>        <resource>            <directory>${project.basedir}/src/main/resources</directory>            <filtering>true</filtering>        </resource>    </resources>    <testResources>        <testResource>            <directory>${project.basedir}/src/test/resources</directory>            <filtering>true</filtering>        </testResource>    </testResources></build>

从上面的配置中可以看出,我们其实可以配置多个主资源目录和多个测试资源目录。
Maven除了可以对主资源目录、测试资源目录过滤外,还能对Web项目的资源目录(如css、js目录)进行过滤。这时需要对maven-war-plugin插件进行配置

<plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-war-plugin</artifactId>    <version>2.1-beta-1</version>    <configuration>        <webResources>            <resource>                <filtering>true</filtering>                <directory>src/main/webapp</directory>                <includes>                    <include>**/*.css</include>                    <include>**/*.js</include>                </includes>            </resource>        </webResources>    </configuration></plugin>

Maven Profile

每个Profile可以看作是POM的一部分配置,我们可以根据不同的环境应用不同的Profile,从而达到不同环境使用不同的POM配置的目的。
profile可以声明在以下这三个文件中:

  • pom.xml:很显然,这里声明的profile只对当前项目有效
  • 用户settings.xml:.m2/settings.xml中的profile对该用户的Maven项目有效
  • 全局settings.xml:conf/settings.xml,对本机上所有Maven项目有效

非常值得注意的一点是,profile在pom.xml中可声明的元素在settings.xml中可声明的元素是不一样的。

  1. profile在pom.xml中可声明的元素:
<project>      <repositories></repositories>      <pluginRepositories></pluginRepositories>      <distributionManagement></distributionManagement>      <dependencies></dependencies>      <dependencyManagement></dependencyManagement>      <modules></modules>      <properties></properties>      <reporting></reporting>      <build>          <plugins></plugins>          <defaultGoal></defaultGoal>          <resources></resources>          <testResources></testResources>          <finalName></finalName>      </build>  </project>
  1. profile在settings.xml中可声明的元素
<project>      <repositories></repositories>      <pluginRepositories></pluginRepositories>      <properties></properties>  </project>

激活Profile

有多种激活Profile的方式:
1. 命令行方式激活,如有两个profile id为devx和devy的profile

mvn clean install  -Pdevx,devy
  1. settings文件显式激活
<settings>      ...      <activeProfiles>          <activeProfile>devx</activeProfile>          <activeProfile>devy</activeProfile>      </activeProfiles>      ...  </settings>
  1. 系统属性激活,用户可以配置当某系统属性存在或其值等于期望值时激活profile,如
<profiles>      <profile>          <activation>              <property>                  <name>actProp</name>                  <value>x</value>              </property>          </activation>      </profile>  </profiles>

不要忘了,可以在命令行声明系统属性。如:

mvn clean install -DactProp=x

这其实也是一种从命令行激活profile的方法,而且多个profile完全可以使用同一个系统属性来激活。别忘了,系统属性可以通过mvn help:system来查看。

  1. 操作系统环境激活,如
<profiles>      <profile>          <activation>              <os>                  <name>Windows XP</name>                  <family>Windows</family>                  <arch>x86</arch>                  <version>5.1.2600</version>              </os>          </activation>      </profile>  </profiles>

这里的family值包括Window、UNIX和Mac等,而其他几项对应系统属性的os.name、os.arch、os.version

  1. 文件存在与否激活,Maven能根据项目中某个文件存在与否来决定是否激活profile
<profiles>      <profile>          <activation>              <file>                  <missing>x.properties</missing>                  <exists>y.properties</exists>              </file>          </activation>      </profile>  </profiles>

:插件maven-help-plugin提供了一个目标帮助用户了解当前激活的profile:
mvn help:active-profiles
另外还有一个目标来列出当前所有的profile:
mvn help:all-profiles

maven引入自定义jar的三种方式

引入方式一

假如你自定义的jar包是util.jar,你想在你项目的pom.xml中这样引入你的jar包

<dependency>    <groupId>com.apple</groupId>    <artifactId>util</artifactId>    <version>1.0</version></dependency>

在你的 localRepository 根目录文件夹下建 com 文件夹、apple 文件夹 -> 再创建 util 文件夹 -> 再创建1.0文件夹 -> 最后把 util.jar 放到 1.0 文件夹下 -> 把 util.jar改为 util-1.0.jar,并创建文件 util-1.0.pom(util-1.0.pom内容如下):

<project>    <modelVersion>1.0.0</modelVersion>    <groupId>com.apple</groupId>    <artifactId>util</artifactId>    <version>1.0</version></project>

此时就可以在使用了。
如果pom.xml报错,强制更新下pom.xml文件:Maven->Update Project,勾上 force update of snapshots/releases 选项,更新一下工程即可。

引入方式二(推荐)

对于常用的包建议使用此方法。
确保在cmd当中可以正确使用mvn命令(通过mvn -v可以验证),然后使用如下命令。

mvn install:install-file -Dfile=sosjon-demo.jar -DgroupId=com.sojson -DartifactId=com.sojson.demo -Dversion=1.0 -Dpackaging=jar

参数说明
mvn install:install-file // mvn 命令
-Dfile=sosjon-demo.jar // 要添加的包
-DgroupId=com.sojson // pom文件对应的groupId
-DartifactId=com.sojson.demo // pom文件对应的artifactId
-Dversion=1.0 // 添加包的版本
-Dpackaging=jar //

-Dfile参数指你自定义JAR包文件所在的路径,并依次指定了自定义的GroupId、ArtifactId和Version信息。
通过这种方式,可以简单快速地将第三方JAR包安装到本地仓库中供Maven项目依赖使用。

<dependency>    <groupId>com.tech4j.driver</groupId>    <artifactId>oracle-connector-java</artifactId>    <version>12.1</version></dependency>

引入方式三

不太建议使用此方法,因为Maven是用来团队合作、发布开源代码的。而使用本地jar包,使得Maven丧失了这部分的优点。

<dependency>    <groupId>org.jasig.cas</groupId>    <artifactId>cas-server-webapp</artifactId>    <version>4.2.3</version>    <type>war</type>    <!-- 注意scope是system -->    <scope>system</scope>    <!-- <systemPath>C:/Users/ice-wee/Downloads/cas-server-webapp-4.0.3.war</systemPath> -->    <systemPath>${project.basedir}/suiyijiandewenjianjia/cas-server-webapp-4.0.3.war</systemPath>    <!-- systemPath 可以写 1 本地路径 也可以写 2 项目根路径,项目根路径不是相对classpath 。 --></dependency>

此方法不会把 jar 包打进 war 包中,如果想打进 war 包中,还是建议使用上面两种方式。或者是添加如下配置:

<build>    <finalName>weixin</finalName>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-war-plugin</artifactId>            <configuration>                <webResources>                    <resource>                        <directory>${project.basedir}\</directory>                        <targetPath>WEB-INF/lib</targetPath>                        <filtering>true</filtering>                        <includes>                            <include>pinyin4j-2.5.0.jar</include>                        </includes>                    </resource>                </webResources>            </configuration>        </plugin>    </plugins></build>

参数说明:
directory是pinyin4j.jar的路径
targetPath则是编译后要把这些jar包复制到的位置

创建jar文件

使用Eclipse的Export功能,类型选择Java -> JAR file,导出即可。

原创粉丝点击