@EdwinTang
2016-04-13T23:42:23.000000Z
字数 4228
阅读 1330
Maven使用
maven构建需要写详细步骤吗?
以前接触的构建工具,需要写一些详细的步骤,比如: compile /src/*.java类似的语句。这些语句正是我们使用ant和make所要编写的东西。maven采用了"约定优于配置"的方法,开发常用的操作和步骤已经固化在 maven中,所以使用者不再需要去编写没有必要的语句。同时,maven内置了开发流程的支持,它不仅能够编译,同样能够打包、发布,也能够一气呵成。
maven有哪些"约定优于配置"。在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是使用者除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如下:
/项目目录
pom.xml 用于maven的配置文件
/src 源代码目录
/src/main 工程源代码目录
/src/main/java 工程java源代码目录
/src/main/resource 工程的资源目录
/src/test 单元测试目录
/src/test/java
/target 输出目录,所有的输出物都存放在这个目录下
/target/classes 编译之后的class文件
每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出class文件存放到target/classes中。
对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。
maven有哪些变量
maven定义了很多变量属性,参考这里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide
1.内置属性
${basedir} represents the directory containing pom.xml
${version} equivalent to ${project.version} or ${pom.version}
2.Pom/Project properties 所有pom中的元素都可以用 project. 前缀进行引用,以下是部分常用的
${project.build.directory} results in the path to your "target" dir, this is the same as ${pom.project.build.directory}
${project.build. outputDirectory} results in the path to your "target/classes" dir
${project.name} refers to the name of the project.
${project.version} refers to the version of the project.
${project.build.finalName } refers to the final name of the file created when the built project is packaged
3.本地用户设定 所有用的的 settings.xml 中的设定都可以通过 settings. 前缀进行引用
${settings.localRepository} refers to the path of the user's local repository.
${maven.repo.local} also works for backward compatibility with maven1
4.环境变量 系统的环境变量通过 env. 前缀引用
${env.M2_HOME} returns the Maven2 installation path.
${java.home} specifies the path to the current JRE_HOME environment use with relative paths to get for example:
<jvm>${java.home}../bin/java.exe</jvm>
5.java系统属性 所有JVM中定义的java系统属性.用户在pom中定义的自定义属性
<project>
<properties>
<my.filter.value> helloword </my.filter.value>
</properties>
</project>
则引用 ${my.filter.value } 就会得到值 helloword
外部依赖说明都有哪些关键要素?groupId, artifactId, version, scope, type,optional。其中前3个是必须的,各自含义如下:
1.groupId 必须
2.artifactId 必须
3.version 必须。这里的version可以用区间表达式来表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多个条件之间用逗号分隔,比如[1,3),[5,7]。
4.scope 作用域限制
5.type 一般在pom引用依赖时候出现,其他时候不用
6.optional 是否可选依赖
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。在maven中,scope包含如下的取值:
1.compile(编译范围)compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
2.provided(已提供范围)provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的ServletAPI来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个ServletAPI-JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
3.runtime(运行时范围)Runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC-API-JAR,而只有在运行的时候才需要JDBC驱动实现。
4.test(测试范围)test范围依赖-在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
5.system(系统范围)system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
1.maven打包时始终出现TripApplyAction.java:[267,6]-source 1.3中不支持泛型(请使用-source 5或更高版本以启用泛型)Map map = new HashMap();
解决方法,指定JDK版本:
在pom.xml文件中加入下一面一段语句来指定所用的版本,尽管在eclipse中配置了正确的“Build Path”:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.5</target>
<source>1.5</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
重新运行mvn clean package,问题解决。
ReasonPhrase: Forbidden:
注意用户的权限以及角色role的设置,一般是没有权限才会被禁止的。
Failed to collect dependencies:
1.需要把parent工程,也就是package是pom的那个工程先install一下,或者deploy
2.需要注意在设置的<profile>工厂里面是否可以访问,如果直接访问public分组,那么就要检查public分组是否添加了自己设置的工厂
child module ....pom.xml does not exist:
1.注意module的名称是否正确,有时候命名问题会导致找不到项目的
2.注意一开始项目命名的规则问题
Cannot detect Web Project version. Please specify version of Web Project through configuration property of war plugin. E.g.: maven-war-plugin 3.0
在pom.xml加入plugin多的定义即可
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<version>3.0</version>
</configuration>
</plugin>
Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project marer-test-weixin: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
加入以下插件引用:主要是因为没有指定web.xml的位置,在pom.xml中加入
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<version>3.0</version>
<webXml>WebRoot\WEB-INF\web.xml</webXml><!-- 这里指定位置 -->
</configuration>
</plugin>