refer: http://www.jdonee.com/category/%E6%8A%80%E6%9C%AF%E4%B8%93%E6%A0%8F
/maven/maven%E9%97%AE%E7%AD%94%E6%94%B6%E9%9B%86/
Maven常见问题解答(三)
2010 年 11 月 06 日, 上午 12:44
1、为什么我在私服中存在的某个版本的依赖,而Eclipse项目中引用该依赖不成功,报”miss ***.jar”错误?
在当前工程目录下运行”mvn eclipse:eclipse”,然后在Eclipse下刷新该工程。
2、引用某个过时的Java API导致Maven出现ERROR警告导致编译失败,该怎么处理?
1)升级Java compiler插件的版本至2.3.2及以后。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
2)当然是修改你的API方法。
3、如何导出当前项目依赖的源码jar?
在当前项目下运行:
mvn dependency:copy-dependencies -Dclassifier=sources
默认会在${project.build.directory}/dependency里(一般是target目录下)。如果你要改变它的地址,就添加outputDirectory参数。比如要存放在d:dependency目录下,命令如下:
mvn dependency:copy-dependencies -Dclassifier=sources -DoutputDirectory=d:dependency
注:很有可能有些jar包没有提供源代码,导致你构建失败。那么你这种情况你可以通过excludeArtifactIds参数排除这些jar,多个jar直接用”,”分隔,命令如下:
mvn dependency:copy-dependencies -Dclassifier=sources -DexcludeArtifactIds=bcprov-jdk15,junit,……
关于dependency更多使用方式,请参阅Maven Dependency Plugin。
4、如何下载当前项目依赖的源码jar?
1)在当前项目下运行:
mvn dependency:sources
默认会安装在本地仓库。
2)如果你是在Eclipse环境下使用,通过“preferences”进入,点击“Maven”,勾选“Download Artifact Sources”。重启eclipse,构建工程时,就会下载依赖的源码jar。
原创文章,转载请注明: 转载自爱飞年代
本文链接地址: Maven常见问题解答(三)
文章的脚注信息由WordPress的wp-posturl插件自动生成
Popularity: 70% [?]
Category: Maven, Maven问答收集, 技术专栏 | 评论
Maven常见问题解答(二)
2010 年 11 月 05 日, 下午 8:33
1、POM的资源可继承吗?
当然可以,但只有在子POM没有任何资源的情况下。如果有,子POM只会应用当前的资源,并会覆盖父POM传递下来的相同资源。
2、Maven的继承顺序是怎样的?
1)parent pom
2)project pom
3)settings
4)命令行参数
其中后面的会覆盖前面的。
3、我在哪里可以获得Maven的Eclipse插件?
http://maven.apache.org/eclipse-plugin.html
这里还提供了一些关于如何使用该插件的Flash演示。
4、我该如何使用1.4.x的或1.5.x的JDK编译1.3的Java源代码?
您需要指定<compilerVersion>元素为1.3。
<project>
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!– path-to-javac –></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
…
</project>
5、如何在我的pom文件中引用windows 或者unix 环境变量?
从Maven 2.0.1开始,你可以在你的pom.xml或者settings.xml文件使用如下表达式引用windows 和unix 环境变量。
${env.VARNAME}
所以,你想要引用你的主目录环境变量,可以使用:
${env.HOME}
6、如何使子项目不继承父项目的目标(如install)?
使用inherited 属性,设置插件的配置为false。举例来说,如果你想安装父项目,而不想安装子项目。你可以在当前项目的install插件中进行如下配置:
<plugin>
<artifactId>maven-install-plugin</artifactId>
<configuration>
<inherited>false</inherited>
</configuration>
</plugin>
7、如何指定当前WAR模块继承父项目组WAR模块下的公共文件?
从maven-war-plugin 2.0-beta-3及以后的版块开始支持合并war。你只要在你的war模块中添加另一个类型为WAR的依赖,它们就会自动完成合并。
如果你想要获得更具体的操作,请查阅使用Maven WAR插件实现多Web应用间的重迭运用。
8、怎么在Maven2里配置相当于war插件的maven.war.src的目录结构?
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warSourceDirectory><!– 目录地址–></warSourceDirectory>
</configuration>
</plugin>
</plugins>
…
</build>
查看war插件的可配置属性可获得更多信息。
9、如何指定Eclipse插件生成的输出目录放入到.classpath文件里?
<build>
...
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<outputDirectory>target-eclipse</outputDirectory>
</configuration>
</plugin>
</plugins>
</pluginManagement>
...
</build>
10、如何为一个可执行jar添加主运行类?
配置maven-jar-plugin,然后添加主类:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mycompany.app.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
11、我能禁止使用传递依赖吗?
很抱歉,不能,不过你可以在项目里排除相关的依赖。
下面是一个关于排除依赖的示例:
<project>
…
<dependency>
<groupId><!– group id –></groupId>
<artifactId><!– artifact id –></artifactId>
<version><!– version –></version>
<scope><!– scope –></scope>
<exclusions>
<exclusion><!–排除的依赖都写着这里–>
<groupId><!– groupId –></groupId>
<artifactId><!– artifactId–></artifactId>
</exclusion>
</exclusions>
</dependency>
</project>
12、Maven中有没有方法在每次构建时不通过编辑pom或者配置文件就能够指定不同的输出目录吗?
当然有,你可以通过配置<properties>来完成这项工作。
要做到这一点,你只需在pom文件添加以下片段:
<project>
...
<build>
<directory>${directory}</directory>
<outputDirectory>${directory}/classes</outputDirectory>
<testOutputDirectory>${directory}/test-classes</testOutputDirectory>
</build>
<properties>
<directory>target</directory> <!-- 设置默认 -->
</properties>
...
</project>
现在你可以在命令行使用directory属性作为一个命令行参数来为它在运行时指定一个输出目录:
mvn -Ddirectory=tmp package
这样,${basedir}/tmp文件夹将作为新的输出目录。
13、我web项目中的自定义目录布局中有了一个web.xm文件,但是为什么我还是获得“Deployment descriptor <Path>WEB-INFweb.xml does not exist”错误呢?
你可以通过maven-war-plugin在你的Web应用中指定你web.xml文件的路径。
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml><!– web.xml的路径 –></webXml>
</configuration>
</plugin>
</plugins>
</build>
14、我该如何在打包的Jar中过滤某些文件呢?
所有编译过的class文件总会放入打包的jar中。但是,你能配置通过使用compiler 插件的excludes 参数排除一些无须打包的文件。
<project>
…
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/NotNeeded*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
…
</build>
</project>
15、如何在deploy阶段期间部署我的二进制文件?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<!– 这里输入你的配置 –>
</configuration>
</execution>
</executions>
</plugin>
然后执行”mvn deploy” 。
16、如何在surefire插件增加一个配置来阻止测试过程运行多次?
可以在插件的executions元素外声明如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.0</version>
<configuration>
<systemProperties>
<property>
<name>net.sourceforge.cobertura.datafile</name>
<value>C:cobertura.ser</value>
</property>
</systemProperties>
</configuration>
</plugin>
17、如何使用不同的配置文件来执行assembly插件?
你可以在pom.xml文件里增加如下配置:
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>1</id>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<descriptor>src/main/descriptors/bin.xml</descriptor>
<finalName>${project.build.finalName}-bin</finalName>
</configuration>
</execution>
<execution>
<id>2</id>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<descriptor>src/main/descriptors/src.xml</descriptor>
<finalName>${project.build.finalName}-src</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
然后执行mvn install,它将通过不同的配置执行assembly插件两次。
18、如何使用antrun插件生成源代码?
下面是你要在该插件的选项中生成源代码的步骤。注意:很有可能只有最新的SVN插件版本才支持。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<!– 你脚本执行必须的依赖 –>
</dependencies>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<!– 这里嵌入你的ant任务,也可以委托给一个build.xml–>
<path id=”classpath”>
<path refid=”maven.compile.classpath”/>
<path refid=”maven.plugin.classpath”/>
</path>
<ant antfile=”${basedir}/build.xml” dir=”${basedir}” inheritRefs=”true”>
<target name=”generate-sources”/>
</ant>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
19、如何在Maven中针对多个阶段,执行ant 任务多次?
executions标签可以指定多个execution元素,ant的执行目标中可以针对不同的Maven阶段绑定不同的ID。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>one</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<echo message=” start generate-sources!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>two</id>
<phase>package</phase>
<configuration>
<tasks>
<echo message=” start packaging!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
20、为什么我没有在我的项目站点里获得生成的index.html页面?
这个原因通常是配置maven-project-info-reports plugin时忽略了”index”报告。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet>
<reports>
<report>index</report> <!–这里–>
<report>dependencies</report>
<report>cim</report>
<report>scm-list</report>
<report>issue-tracking</report>
</reports>
</reportSet>
</reportSets>
</plugin>
21、如何把静态的X(HTML)文件整合到我生成的站点里?
通过如下步骤你就能达到目的:
1)把你的静态页面放入到资源目录下,${basedir}/src/site/resources。
2)创建你的site.xml,并放入到${basedir}/src/site。xml示例:
<project name="Maven War Plugin">
<bannerLeft>
<name>Maven War Plugin</name>
<src>http://maven.apache.org/images/apache-maven-project.png</src>
<href>http://maven.apache.org/</href>
</bannerLeft>
<bannerRight>
<src>http://maven.apache.org/images/maven-small.gif</src>
</bannerRight>
<body>
<links>
<item name="Maven 2" xhref="http://maven.apache.org/maven2/"/>
</links>
<menu name="Overview">
<item name="Introduction" xhref="introduction.html"/>
<item name="How to Use" xhref="howto.html"/>
</menu>
${reports}
</body>
</project>
3)修改”menu”来链接静态页面,然后通过静态页的名称来创建选项和站点地图。
<menu name="Overview">
<item name="Introduction" xhref="introduction.html"/>
<item name="How to Use" xhref="howto.html"/>
<item name="<put-name-here>" xhref="<filename-of-the-static-page>"/>
</menu>
22、怎样从一个mojo里获取一个插件的依赖?
public class MyMojo extends AbstractMojo
{
/**
* @parameter expression="${plugin.artifacts}"
* @required
*/
private List pluginArtifacts;
public void execute()
throws MojoExecutionException
{
...
for ( Iterator i = pluginArtifacts.iterator(); i.hasNext(); )
{
Artifact pluginArtifact = (Artifact) i.next();
}
...
}
}
23、怎样从一个Mojo里获取项目的来源?
public class MyMojo extends AbstractMojo
{
/**
* @parameter expression="${project.compileSourceRoots}"
* @required
*/
private List sourceRoots;
public void execute() throws MojoExecutionException
{
...
for ( Iterator i = sourceRoots.iterator(); i.hasNext(); )
{
String sourceRoot = (String) i.next();
// Do what you want with these directories
}
}
}
24、如何在我的mojo里创建一个命令行参数(如-Dname=value )?
你可以在你的mojo里的参数字段中输入”expression=${<exp>}” 。
/**
* @parameter expression="${expression.name}"
*/
private String exp;
你现在就可以在命令行里运行参数:
“mvn -Dexpression.name=value install”
原创文章,转载请注明: 转载自爱飞年代
本文链接地址: Maven常见问题解答(二)
文章的脚注信息由WordPress的wp-posturl插件自动生成
Popularity: 100% [?]
Category: Maven, Maven问答收集, 技术专栏 | 1 条评论
Maven常见问题解答(一)
2010 年 11 月 05 日, 下午 8:06
1、如何阻止编译时出现”[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!”这样的警告?
出现类似这样的情况很多,这是因为如果你没有为编译的文件指定编码格式的话,它一般就会引用系统本身的编码,解决的办法也很简单,你只要在pom.xml(或者父项目的pom.xml)下的设置如下属性:
通用设置:
<project>
…
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
…
</project>
M3设置:
<project>
…
<properties>
<sourceEncoding>UTF-8</sourceEncoding>
</properties>
…
</project>
2、如何阻止把某些JAR包添加到WEB-INF/lib文件夹下?因为我只是想在编译时使用它!
把依赖的范围级别定义为provided,这样可以避免运行时依赖冲突。
3、如何确定我使用的是哪个版本的插件?
你可以使用Maven Help 插件的describe目标。比如你要查看install插件的当前版本:
mvn -Dplugin=install help:describe
如果想要更详细的信息,增加-Ddetail。
mvn -Dplugin=install help:describe -Ddetail
注意:这里的参数是插件的目标前缀,而不是构件的ID。比如 Maven Install Plugin的构件ID是:maven-install-plugin,而前缀是install。
4、我如何在一次Maven构建中使用ant任务?
目前有两个选择。
1)按照 instructions given in the Ant documentation自己实现。
2)如果你只需要在你的Maven构建里使用少量的ant脚本,那么你可以使用AntRun插件。
5、那么我如何在一次Ant构建中使用Maven的特性呢?
Maven Ant Tasks可以让Ant构建使用Maven的很多特性,诸如依赖管理、仓库部署等等。
6、我如何在Maven编译代码时自定义JVM的源代码和输出格式呢?
你必须在pom.xml文件里设置source和target参数。比如你要设置JVM的源代码和输出格式为1.5,那么在pom文件里可以如下设置:
…
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
…
</build>
…
7、我是否可以在Maven中创建自己的目录结构呢?
当然可以。通过配置<sourceDirectory>,<resources>和<build>部分的其它元素。此外,如果你不使用默认的文件/目录格式的话,你还必须修改相关插件的配置。
坦白讲,这是一件得不偿失的事情。
8、我如何查找Maven的源代码呢?
源代码可以通过Maven版本库找到。
如果要查阅更多信息,请点击Building Maven 2.0。
9、为何我不能正确下载Maven的依赖?
你很有可能是因为公司网络的原因限制下载,不过你可以为Maven配置一个代理。具体的操作可以参阅配置代理。
10、我想把一个Jar存放到我的本地仓库,该怎么做?
如果你了解Maven的仓库布局,它会直接复制jar过去,Maven会在下一次运行时自动发现。
如果你不了解Maven的仓库布局,你可以在命令行中使用如下的命令加载Jar文件(此命令为一行,切莫回车)。
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true
其中: <path-to-file> 需加载的文件路径
<group-id> 该文件的组ID
<artifact-id> 该文件的构件ID
<version> 该文件的版本
<packaging> 该 文件的打包格式,如jar
11、如何跳过测试?
你可以在命令行增加-Dmaven.test.skip=true或-DskipTests=true参数,前者会跳过测试的编译和执行,后者仅仅跳过测试的执行。更多示例请查阅Surefire插件的跳过测试部分。
12、如何在Maven中运行一个单元测试?
在命令行增加-Dtest=MyTest参数。注:不能指定包名,如(org.apache.x.y.MyTest)
13、如何处理站点的特殊字符?
首先配置你的IDE使用正确的编码。如果使用Eclipse,在eclipse.ini中增加 -Dfile.encoding=ISO-8859-1。
在你的pom文件中配置你的输出编码:
…
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-6</version>
<configuration>
<outputEncoding>UTF-8</outputEncoding>
</configuration>
</plugin>
…
然后在MAVEN_OPTS中增加跟IDE一样的编码格式,如MAVEN_OPTS=”-Dfile.encoding=ISO-8859-1″。本人不推荐直接修改Maven的BIN目录下的mvn文件,而是添加一个环境变量MAVEN_OPTS。
14、如何在我的依赖中添加tools.jar?
下面的代码可以把tools.jar包含在Windows, Linux 和 Solaris系统的JDKs中(Mac OS X和其它免费的JDKs中已经包含了)。
…
<profiles>
<profile>
<id>default-tools.jar</id>
<activation>
<property>
<name>java.vendor</name>
<value>Sun Microsystems Inc.</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.4.2</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
</profiles>
…
15、Maven编译了我的测试类,但是为什么不运行呢?
测试一般都是由Surefire插件运行的。Surefire插件用来配置运行某些测试类,你很有可能无意中指定了${test}这样的值。检查你的settings.xml和pom.xml文件,看有没有命名为”test”的属性,如下列方式:
…
<properties>
<property>
<name>test</name>
<value>some-value</value>
</property>
</properties>
…
或者
…
<properties>
<test>some-value</test>
</properties>
…
16、Maven的SNAPSHOT(快照)构件存放在哪里?
如果你想要使用Maven或者插件的快照来进行构建,那么你应该要访问Maven快照仓库。
你可能需要通过快照仓库使用指南更新你的settings文件。
17、Maven 的XSD schemas存放在哪里?
Maven XSD 存放在这里,Maven Settings XSD 存放在这里。
你的IDE很有可能支持pom.xml和settings.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“>
…
</project>
<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“>
…
</settings>
18、如果Maven不能正常工作,我该如何获取帮助?
Maven官方编制了一个可用帮助列表。
19、如何在Maven构建时产生调试或者错误信息呢?
你可以在Maven构建是调用-X(必须大写)或者-e参数。如果你要了解更多信息,在命令行执行:mvn –help
20、Mojo是什么?
Mojo是Maven中一个普通的持久化对象。每一个Mojo都是Maven中的一个执行目标,一个插件一般包含一个或者多个相关的Mojo。
21、怎样在公共Maven仓库中寻找依赖?
你可以使用下列搜索引擎:
http://repository.apache.org
http://www.artifact-repository.org
http://mvnrepository.com
http://www.mvnbrowser.com
http://www.jarvana.com
http://mavensearch.net
/maven/maven%E9%97%AE%E7%AD%94%E6%94%B6%E9%9B%86/
Maven常见问题解答(三)
2010 年 11 月 06 日, 上午 12:44
1、为什么我在私服中存在的某个版本的依赖,而Eclipse项目中引用该依赖不成功,报”miss ***.jar”错误?
在当前工程目录下运行”mvn eclipse:eclipse”,然后在Eclipse下刷新该工程。
2、引用某个过时的Java API导致Maven出现ERROR警告导致编译失败,该怎么处理?
1)升级Java compiler插件的版本至2.3.2及以后。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
2)当然是修改你的API方法。
3、如何导出当前项目依赖的源码jar?
在当前项目下运行:
mvn dependency:copy-dependencies -Dclassifier=sources
默认会在${project.build.directory}/dependency里(一般是target目录下)。如果你要改变它的地址,就添加outputDirectory参数。比如要存放在d:dependency目录下,命令如下:
mvn dependency:copy-dependencies -Dclassifier=sources -DoutputDirectory=d:dependency
注:很有可能有些jar包没有提供源代码,导致你构建失败。那么你这种情况你可以通过excludeArtifactIds参数排除这些jar,多个jar直接用”,”分隔,命令如下:
mvn dependency:copy-dependencies -Dclassifier=sources -DexcludeArtifactIds=bcprov-jdk15,junit,……
关于dependency更多使用方式,请参阅Maven Dependency Plugin。
4、如何下载当前项目依赖的源码jar?
1)在当前项目下运行:
mvn dependency:sources
默认会安装在本地仓库。
2)如果你是在Eclipse环境下使用,通过“preferences”进入,点击“Maven”,勾选“Download Artifact Sources”。重启eclipse,构建工程时,就会下载依赖的源码jar。
原创文章,转载请注明: 转载自爱飞年代
本文链接地址: Maven常见问题解答(三)
文章的脚注信息由WordPress的wp-posturl插件自动生成
Popularity: 70% [?]
Category: Maven, Maven问答收集, 技术专栏 | 评论
Maven常见问题解答(二)
2010 年 11 月 05 日, 下午 8:33
1、POM的资源可继承吗?
当然可以,但只有在子POM没有任何资源的情况下。如果有,子POM只会应用当前的资源,并会覆盖父POM传递下来的相同资源。
2、Maven的继承顺序是怎样的?
1)parent pom
2)project pom
3)settings
4)命令行参数
其中后面的会覆盖前面的。
3、我在哪里可以获得Maven的Eclipse插件?
http://maven.apache.org/eclipse-plugin.html
这里还提供了一些关于如何使用该插件的Flash演示。
4、我该如何使用1.4.x的或1.5.x的JDK编译1.3的Java源代码?
您需要指定<compilerVersion>元素为1.3。
<project>
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!– path-to-javac –></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
…
</project>
5、如何在我的pom文件中引用windows 或者unix 环境变量?
从Maven 2.0.1开始,你可以在你的pom.xml或者settings.xml文件使用如下表达式引用windows 和unix 环境变量。
${env.VARNAME}
所以,你想要引用你的主目录环境变量,可以使用:
${env.HOME}
6、如何使子项目不继承父项目的目标(如install)?
使用inherited 属性,设置插件的配置为false。举例来说,如果你想安装父项目,而不想安装子项目。你可以在当前项目的install插件中进行如下配置:
<plugin>
<artifactId>maven-install-plugin</artifactId>
<configuration>
<inherited>false</inherited>
</configuration>
</plugin>
7、如何指定当前WAR模块继承父项目组WAR模块下的公共文件?
从maven-war-plugin 2.0-beta-3及以后的版块开始支持合并war。你只要在你的war模块中添加另一个类型为WAR的依赖,它们就会自动完成合并。
如果你想要获得更具体的操作,请查阅使用Maven WAR插件实现多Web应用间的重迭运用。
8、怎么在Maven2里配置相当于war插件的maven.war.src的目录结构?
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warSourceDirectory><!– 目录地址–></warSourceDirectory>
</configuration>
</plugin>
</plugins>
…
</build>
查看war插件的可配置属性可获得更多信息。
9、如何指定Eclipse插件生成的输出目录放入到.classpath文件里?
<build>
...
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<outputDirectory>target-eclipse</outputDirectory>
</configuration>
</plugin>
</plugins>
</pluginManagement>
...
</build>
10、如何为一个可执行jar添加主运行类?
配置maven-jar-plugin,然后添加主类:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.mycompany.app.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
11、我能禁止使用传递依赖吗?
很抱歉,不能,不过你可以在项目里排除相关的依赖。
下面是一个关于排除依赖的示例:
<project>
…
<dependency>
<groupId><!– group id –></groupId>
<artifactId><!– artifact id –></artifactId>
<version><!– version –></version>
<scope><!– scope –></scope>
<exclusions>
<exclusion><!–排除的依赖都写着这里–>
<groupId><!– groupId –></groupId>
<artifactId><!– artifactId–></artifactId>
</exclusion>
</exclusions>
</dependency>
</project>
12、Maven中有没有方法在每次构建时不通过编辑pom或者配置文件就能够指定不同的输出目录吗?
当然有,你可以通过配置<properties>来完成这项工作。
要做到这一点,你只需在pom文件添加以下片段:
<project>
...
<build>
<directory>${directory}</directory>
<outputDirectory>${directory}/classes</outputDirectory>
<testOutputDirectory>${directory}/test-classes</testOutputDirectory>
</build>
<properties>
<directory>target</directory> <!-- 设置默认 -->
</properties>
...
</project>
现在你可以在命令行使用directory属性作为一个命令行参数来为它在运行时指定一个输出目录:
mvn -Ddirectory=tmp package
这样,${basedir}/tmp文件夹将作为新的输出目录。
13、我web项目中的自定义目录布局中有了一个web.xm文件,但是为什么我还是获得“Deployment descriptor <Path>WEB-INFweb.xml does not exist”错误呢?
你可以通过maven-war-plugin在你的Web应用中指定你web.xml文件的路径。
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml><!– web.xml的路径 –></webXml>
</configuration>
</plugin>
</plugins>
</build>
14、我该如何在打包的Jar中过滤某些文件呢?
所有编译过的class文件总会放入打包的jar中。但是,你能配置通过使用compiler 插件的excludes 参数排除一些无须打包的文件。
<project>
…
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/NotNeeded*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
…
</build>
</project>
15、如何在deploy阶段期间部署我的二进制文件?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<!– 这里输入你的配置 –>
</configuration>
</execution>
</executions>
</plugin>
然后执行”mvn deploy” 。
16、如何在surefire插件增加一个配置来阻止测试过程运行多次?
可以在插件的executions元素外声明如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.0</version>
<configuration>
<systemProperties>
<property>
<name>net.sourceforge.cobertura.datafile</name>
<value>C:cobertura.ser</value>
</property>
</systemProperties>
</configuration>
</plugin>
17、如何使用不同的配置文件来执行assembly插件?
你可以在pom.xml文件里增加如下配置:
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>1</id>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<descriptor>src/main/descriptors/bin.xml</descriptor>
<finalName>${project.build.finalName}-bin</finalName>
</configuration>
</execution>
<execution>
<id>2</id>
<phase>install</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<descriptor>src/main/descriptors/src.xml</descriptor>
<finalName>${project.build.finalName}-src</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
然后执行mvn install,它将通过不同的配置执行assembly插件两次。
18、如何使用antrun插件生成源代码?
下面是你要在该插件的选项中生成源代码的步骤。注意:很有可能只有最新的SVN插件版本才支持。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<!– 你脚本执行必须的依赖 –>
</dependencies>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<!– 这里嵌入你的ant任务,也可以委托给一个build.xml–>
<path id=”classpath”>
<path refid=”maven.compile.classpath”/>
<path refid=”maven.plugin.classpath”/>
</path>
<ant antfile=”${basedir}/build.xml” dir=”${basedir}” inheritRefs=”true”>
<target name=”generate-sources”/>
</ant>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
19、如何在Maven中针对多个阶段,执行ant 任务多次?
executions标签可以指定多个execution元素,ant的执行目标中可以针对不同的Maven阶段绑定不同的ID。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>one</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<echo message=” start generate-sources!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>two</id>
<phase>package</phase>
<configuration>
<tasks>
<echo message=” start packaging!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
20、为什么我没有在我的项目站点里获得生成的index.html页面?
这个原因通常是配置maven-project-info-reports plugin时忽略了”index”报告。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet>
<reports>
<report>index</report> <!–这里–>
<report>dependencies</report>
<report>cim</report>
<report>scm-list</report>
<report>issue-tracking</report>
</reports>
</reportSet>
</reportSets>
</plugin>
21、如何把静态的X(HTML)文件整合到我生成的站点里?
通过如下步骤你就能达到目的:
1)把你的静态页面放入到资源目录下,${basedir}/src/site/resources。
2)创建你的site.xml,并放入到${basedir}/src/site。xml示例:
<project name="Maven War Plugin">
<bannerLeft>
<name>Maven War Plugin</name>
<src>http://maven.apache.org/images/apache-maven-project.png</src>
<href>http://maven.apache.org/</href>
</bannerLeft>
<bannerRight>
<src>http://maven.apache.org/images/maven-small.gif</src>
</bannerRight>
<body>
<links>
<item name="Maven 2" xhref="http://maven.apache.org/maven2/"/>
</links>
<menu name="Overview">
<item name="Introduction" xhref="introduction.html"/>
<item name="How to Use" xhref="howto.html"/>
</menu>
${reports}
</body>
</project>
3)修改”menu”来链接静态页面,然后通过静态页的名称来创建选项和站点地图。
<menu name="Overview">
<item name="Introduction" xhref="introduction.html"/>
<item name="How to Use" xhref="howto.html"/>
<item name="<put-name-here>" xhref="<filename-of-the-static-page>"/>
</menu>
22、怎样从一个mojo里获取一个插件的依赖?
public class MyMojo extends AbstractMojo
{
/**
* @parameter expression="${plugin.artifacts}"
* @required
*/
private List pluginArtifacts;
public void execute()
throws MojoExecutionException
{
...
for ( Iterator i = pluginArtifacts.iterator(); i.hasNext(); )
{
Artifact pluginArtifact = (Artifact) i.next();
}
...
}
}
23、怎样从一个Mojo里获取项目的来源?
public class MyMojo extends AbstractMojo
{
/**
* @parameter expression="${project.compileSourceRoots}"
* @required
*/
private List sourceRoots;
public void execute() throws MojoExecutionException
{
...
for ( Iterator i = sourceRoots.iterator(); i.hasNext(); )
{
String sourceRoot = (String) i.next();
// Do what you want with these directories
}
}
}
24、如何在我的mojo里创建一个命令行参数(如-Dname=value )?
你可以在你的mojo里的参数字段中输入”expression=${<exp>}” 。
/**
* @parameter expression="${expression.name}"
*/
private String exp;
你现在就可以在命令行里运行参数:
“mvn -Dexpression.name=value install”
原创文章,转载请注明: 转载自爱飞年代
本文链接地址: Maven常见问题解答(二)
文章的脚注信息由WordPress的wp-posturl插件自动生成
Popularity: 100% [?]
Category: Maven, Maven问答收集, 技术专栏 | 1 条评论
Maven常见问题解答(一)
2010 年 11 月 05 日, 下午 8:06
1、如何阻止编译时出现”[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!”这样的警告?
出现类似这样的情况很多,这是因为如果你没有为编译的文件指定编码格式的话,它一般就会引用系统本身的编码,解决的办法也很简单,你只要在pom.xml(或者父项目的pom.xml)下的设置如下属性:
通用设置:
<project>
…
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
…
</project>
M3设置:
<project>
…
<properties>
<sourceEncoding>UTF-8</sourceEncoding>
</properties>
…
</project>
2、如何阻止把某些JAR包添加到WEB-INF/lib文件夹下?因为我只是想在编译时使用它!
把依赖的范围级别定义为provided,这样可以避免运行时依赖冲突。
3、如何确定我使用的是哪个版本的插件?
你可以使用Maven Help 插件的describe目标。比如你要查看install插件的当前版本:
mvn -Dplugin=install help:describe
如果想要更详细的信息,增加-Ddetail。
mvn -Dplugin=install help:describe -Ddetail
注意:这里的参数是插件的目标前缀,而不是构件的ID。比如 Maven Install Plugin的构件ID是:maven-install-plugin,而前缀是install。
4、我如何在一次Maven构建中使用ant任务?
目前有两个选择。
1)按照 instructions given in the Ant documentation自己实现。
2)如果你只需要在你的Maven构建里使用少量的ant脚本,那么你可以使用AntRun插件。
5、那么我如何在一次Ant构建中使用Maven的特性呢?
Maven Ant Tasks可以让Ant构建使用Maven的很多特性,诸如依赖管理、仓库部署等等。
6、我如何在Maven编译代码时自定义JVM的源代码和输出格式呢?
你必须在pom.xml文件里设置source和target参数。比如你要设置JVM的源代码和输出格式为1.5,那么在pom文件里可以如下设置:
…
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
…
</build>
…
7、我是否可以在Maven中创建自己的目录结构呢?
当然可以。通过配置<sourceDirectory>,<resources>和<build>部分的其它元素。此外,如果你不使用默认的文件/目录格式的话,你还必须修改相关插件的配置。
坦白讲,这是一件得不偿失的事情。
8、我如何查找Maven的源代码呢?
源代码可以通过Maven版本库找到。
如果要查阅更多信息,请点击Building Maven 2.0。
9、为何我不能正确下载Maven的依赖?
你很有可能是因为公司网络的原因限制下载,不过你可以为Maven配置一个代理。具体的操作可以参阅配置代理。
10、我想把一个Jar存放到我的本地仓库,该怎么做?
如果你了解Maven的仓库布局,它会直接复制jar过去,Maven会在下一次运行时自动发现。
如果你不了解Maven的仓库布局,你可以在命令行中使用如下的命令加载Jar文件(此命令为一行,切莫回车)。
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true
其中: <path-to-file> 需加载的文件路径
<group-id> 该文件的组ID
<artifact-id> 该文件的构件ID
<version> 该文件的版本
<packaging> 该 文件的打包格式,如jar
11、如何跳过测试?
你可以在命令行增加-Dmaven.test.skip=true或-DskipTests=true参数,前者会跳过测试的编译和执行,后者仅仅跳过测试的执行。更多示例请查阅Surefire插件的跳过测试部分。
12、如何在Maven中运行一个单元测试?
在命令行增加-Dtest=MyTest参数。注:不能指定包名,如(org.apache.x.y.MyTest)
13、如何处理站点的特殊字符?
首先配置你的IDE使用正确的编码。如果使用Eclipse,在eclipse.ini中增加 -Dfile.encoding=ISO-8859-1。
在你的pom文件中配置你的输出编码:
…
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-6</version>
<configuration>
<outputEncoding>UTF-8</outputEncoding>
</configuration>
</plugin>
…
然后在MAVEN_OPTS中增加跟IDE一样的编码格式,如MAVEN_OPTS=”-Dfile.encoding=ISO-8859-1″。本人不推荐直接修改Maven的BIN目录下的mvn文件,而是添加一个环境变量MAVEN_OPTS。
14、如何在我的依赖中添加tools.jar?
下面的代码可以把tools.jar包含在Windows, Linux 和 Solaris系统的JDKs中(Mac OS X和其它免费的JDKs中已经包含了)。
…
<profiles>
<profile>
<id>default-tools.jar</id>
<activation>
<property>
<name>java.vendor</name>
<value>Sun Microsystems Inc.</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.4.2</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
</profiles>
…
15、Maven编译了我的测试类,但是为什么不运行呢?
测试一般都是由Surefire插件运行的。Surefire插件用来配置运行某些测试类,你很有可能无意中指定了${test}这样的值。检查你的settings.xml和pom.xml文件,看有没有命名为”test”的属性,如下列方式:
…
<properties>
<property>
<name>test</name>
<value>some-value</value>
</property>
</properties>
…
或者
…
<properties>
<test>some-value</test>
</properties>
…
16、Maven的SNAPSHOT(快照)构件存放在哪里?
如果你想要使用Maven或者插件的快照来进行构建,那么你应该要访问Maven快照仓库。
你可能需要通过快照仓库使用指南更新你的settings文件。
17、Maven 的XSD schemas存放在哪里?
Maven XSD 存放在这里,Maven Settings XSD 存放在这里。
你的IDE很有可能支持pom.xml和settings.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“>
…
</project>
<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“>
…
</settings>
18、如果Maven不能正常工作,我该如何获取帮助?
Maven官方编制了一个可用帮助列表。
19、如何在Maven构建时产生调试或者错误信息呢?
你可以在Maven构建是调用-X(必须大写)或者-e参数。如果你要了解更多信息,在命令行执行:mvn –help
20、Mojo是什么?
Mojo是Maven中一个普通的持久化对象。每一个Mojo都是Maven中的一个执行目标,一个插件一般包含一个或者多个相关的Mojo。
21、怎样在公共Maven仓库中寻找依赖?
你可以使用下列搜索引擎:
http://repository.apache.org
http://www.artifact-repository.org
http://mvnrepository.com
http://www.mvnbrowser.com
http://www.jarvana.com
http://mavensearch.net