mvn clean install -X
maven默认目录
maven,在没有自定义的情况下,源码假定在\${basedir}/src/main/java;资源文件假定在\${basedir}/src/main/resources;测试代码假定在\${basedir}/src/test;测试资源文件假定在\${basedir}/src/test/resources;编译好的字节码在\${basedir}/target/classes;可以分发的jar包在\${basedir}/target。
其中\${basedir}/src/main/java和\${basedir}/src/main/resources里的文件,打包后都在classpath目录下。
资源目录并非一定要放在src/main/resources下,假设有个项目包含数百个xml文档和数百个图片,可以创建两个目录src/main/xml和src/main/images,并且配置如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/xml</directory>
</resource>
<resource>
<directory>src/main/images</directory>
</resource>
</resources>
</build>
超级pom里资源目录就是这样配置的。
超级pom是maven安装的一部分。settings.xml和pom.xml文件的配置可以覆盖超级pom的设置。
maven插件、目标
第一次使用全新的maven运行 mvn install命令的时候,它会从中央仓库下载大部分核心插件,然后存储在maven仓库里。
mvn help:describe -Dplugin=help
help是一个插件,describe是此插件的一个目标,使用-Dplugin指定想要查看的插件
mvn archetype:generate -DgroupId=com.sto -DartifactId=simple
接下来一路回车,就会生成一个maven项目
archetype,[ˈɑːkitaɪp],典型。archetype是“一个原始的模型或者类型”,maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的Web应用。
artifact [ˈɑːtɪfækt] 手工制品,这里是构件、项目的意思。
上面的命令默认使用maven-archetype-quickstart
mvn install
在包含pom.xml的目录下运行,打包应用
运行程序
java -cp target/simple-1.0-SNAPSHOT.jar com.sto.App
maven运行时,会根据pom.xml的设置来运行,pom.xml是有多个层级的,maven需要组合多个层级的pom文件。查看组合后的pom.xml文件:
mvn help:effective-pom
effective [ɪˈfektɪv] 有效的;实际的
maven插件是单个或多个maven目标的集合。maven插件有archetype、jar、compiler、surefire。
maven目标是一个明确的任务。compiler插件有compile目标,surefire插件有test目标。
目标可以通过配置属性来定义其行为,比如:mvn archetype:generate -DgroupId=com.sto -DartifactId=simple,配置了组Id和项目Id。
插件前缀
mvn org.apche.maven.plugins:maven-jar-plugin:2.2:jar
mvn jar:jar
生命周期和生命周期阶段
mvn package,package是一个生命周期阶段
maven有三个标准的生命周期,clean、default、site。
clean包含三个生命周期阶段,pre-clean、clean、post-clean。
default其中包含test、package、install、deploy这些阶段。deploy,复制包到远程maven仓库。
生命周期包含一系列有序的阶段,每个阶段可以绑定零个或多个目标,比如package生命周期阶段绑定了jar:jar插件目标;clean生命周期阶段绑定了clean插件的clean目标;site生命周期包含有site生命周期阶段,该阶段绑定了site插件的site目标。
maven执行一个阶段时,会有序地执行前面的所有阶段,直到指定的那个阶段为止。
mvn package,相当于 mvn resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar
packaging有jar、war、maven-plugin。packaging是jar和war不同类型的构件,绑定在package生命周期阶段的插件目标也不同,有jar:jar,有war:war。
\${}的使用
maven有三个隐式的变量,env、project、settings。
\${env.PATH}
\${settings.offline}
\${project.groupId}
还可以在pom.xml或settings.xml中提供properties元素设置自己的属性。
<properties>
<foo>bar</foo>
</properties>
\${project.foo}或\${foo}
还可以访问java系统属性,所有可以通过java.lang.System的getProperties()方法访问的属性,${user.name}
maven资源过滤
resources:resources目标首先过滤资源,然后将资源复制到输出目录。
就像在pom文件中使用\${}引用变量一样,也可以在资源文件中使用。
资源过滤即替换资源文件中的一些符号,与profile联系起来,就可以生成针对不同部署平台的构件;。
maven默认会跳过资源过滤,我们需要显示地配置资源过滤:
<build>
<filters>
<filter>src/main/my.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
1、建立一个maven项目 mvn archetype:generate -DgroupId=com.sto -DartifactId=simple 2、打开resources目录,随便自定义一个文件,取名service.xml,文件内容如下: <service> <!-- ${project.version} --> <!-- ${env.PATH} --> <url>${jdbc.url}</url> <user>${jdbc.username}</user> <password>${jdbc.password}</password> </service> 3、再建立一个my.properties文件,内容如下: jdbc.url=jdbc:hsqldb:mem:mydb jdbc.username=sa jdbc.password=123 4、配置资源过滤 <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <filters> <filter>src/main/my.properties</filter> </filters> </build> 5、执行mvn package 6、查看target/classes/service.xml