maven - Maven Weed
来源:互联网 发布:魏志香 知乎 编辑:程序博客网 时间:2024/05/02 04:49
学习、使用Maven的过程中,亲身遇到或看到的一些问题的解决方法。Maven有不少Bug,大家使用时一定要小心。(2007.02.10最后更新)
向本地仓库安装文件
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>-DgeneratePom=true -DcreateChecksum=true(需要使用maven-install-plugin 2.2-SNAPSHOT)
打包时,不在META-INF中生成maven目录
使用Maven打包(mvn package)时,默认地会在META-INF中生成一个目录maven,里面是一个pom和一个属性文件。如果不想生成这个目录,需要在POM中进行如下配置:
以对于一般应用程序打包,即制作jar包为例
类似的,对于制作war,ear包,只需要将artifactId换成对应的plugin(maven-war-plugin,maven-ear-plugin)就可以了。
Javadoc中文乱码
中文操作系统中,JDK1.5.0的Javadoc自动默认支持中文,而且页面中的条目名也都默认为中文显示(在之前的JDK中,这些条目名都默认为英文)。如是在这种情况下使用命令mvn javadoc:javadoc生成Javadoc,则这些条目名将成为乱码。
解决方法:让javadoc插件使用UTF16或Unicode字符集。具体配置的形式如下:
Scope
Scope表示了某个依赖关系的适用范围(作用域),共有5个scope。
compile: 默认的适用范围,表示该依赖关系要应用于所有的classpath。
provided: 该适用范围非常像compile适用范围。但它表示该依赖关系已经由JDK或某个容量提供,如javax.servlet。
runtime:表示该依赖关系不用于编译阶段,而只使用于运行时阶段,如apache jakarta commons。
test:表示该依赖关系并不用于实际的应用程序本身,而是该应用的测试程序的编译与运行,如junit。
system:该依赖关系类似于provided,但必须显示地表示是哪一个容器提供了这个artifact。无法在仓库中找到该artifact。
注意:
[1]具有compile或runtime适用范围的依赖关系中的jar文件,制作war文件时将会被放入WEB-INF/lib目录中。
[2]不推荐使用system适用范围。
将mvn.bat配置为Eclipse外部工具
为了能够在Eclipse环境中运行mvn.bat,需要将它配置为一个外部工具(external tool)。在我的Eclipse Weed(配置外部工具)一文中已经提到了如何配置Eclipse External Tools(可先参见该文)。本主题将具体讲述如何将mvn.bat的package Build周期短语配置为外部工具。
[1]主菜单Run-->External Tools-->External Tools...
[2]先选中Program项,再点击左上角的New launch configuration按钮
[3]Name文本框中输入该外部工具的名称“MvnPackage”
[4]通过Browser File System...按钮,向Location文本框中输入mvn.bat文件的绝对路径
[5]通过Variables...按钮,选择project_loc,将向Working Directory文本框中输入${project_loc}
[6]在Augments文本域中输入package
这样当你选中一个pom.xml文件后,再运行该外部工具,就相当于对该POM文件文件执行mvn package命令。
制作war文件时,过滤文件
使用maven-war-plugin制作war文件时,它会先将所有可能用于制作war的内容放入target/artifactId-version目录(标准目录结构)下,然后再将这些文件进行打包。这样就有两种方法进行文件过滤:[1]使期望被过滤的文件一开始就不被放入target/artifactId-version目录,即使它成为不可能的文件;[2]在制作war文件时,不将期望被过滤的文件加入包中。
[1]实现第一种方法,要对dependency进行配置。将不希望加入包的artifact放入exclusion参数中,如下脚本所示:
当加载插件时抛NullPointerException
如果仓库中有某个插件的jar文件有问题,则会抛出这样的异常。遇到这样的问题时,必须将这个有问题的插件清除。
可以在执行参数中加上-X(如mvn -X compile)来获得加载插件的过程,从中可能会发现问题插件。如果还不行,则使用一个新的仓库,再次执行工程。
Install或Deploy源代码
在命令行中设置本地仓库
在使用Maven2命令(mvn)时,可以设置本地仓库的路径,该路径将会替代settings.xml中设置的本地仓库路径。
如命令,mvn -Dmaven.repo.local=Another_Local_Repo package
注:在Maven1中还可以通过-Dmaven.repo.remote设置远程仓库,但目前在Maven2中还不行。
在Maven发行包中找到Super POM文件
所有的POM都默认继承Super POM,该POM定义了Maven标准目录结构。但在Maven的发行包中,这个Super POM是存放在了哪里呢?
这个POM就存放在maven-project的jar文件中。在笔者的机器中,该Super POM的位置是:
Maven_Home/lib/maven-project-2.0.4.jar/org/apache/maven/project/pom-4.0.0.xml
构建Maven远程仓库
构建Maven远程仓库的方法很多,也很简单。常用的Web服务器(Apache,JBoss,Tomcat,...)都可以用于构建Maven远程仓库;而发布artifact时,也可以使用多种协议(FTP,SFTP,SSH,...)。
此处使用RedHat AS 4.0 + Apache2.0.59,并应用SSH协议向远程仓库发布artifact。
[1]在Apache的DocumnetRoot中新建目录maven2/repo,此处该目录的绝对路径为
/usr/local/apache2/htdocs/maven2/repo
[2]在本地Maven的settings.xml文件中设置Server,语句的形式如下:
<servers>
<server>
<id>myrepo</id>
<username>myuser</username>
<password>mypasswd</password>
</server>
</servers>
myuser/mypasswd是登录远程Linux系统时使用的用户名/密码。
[3]在本地工程的pom.xml中进行如下形式的设置:
<distributionManagement>
<repository>
<id>myrepo</id>
<url>scp://Host/usr/local/apache2/htdocs/maven2/repo</url>
</repository>
</distributionManagement>
此处id必须与前面设置的server中的id一致;scp是使用SSH协议的文件传输命令;Host是远程Linux服务器的IP地址或域名;/usr/local/apache2/htdocs/maven2/repo就是Maven仓库在远程服务器中的绝对路径。
[4]在本地中使用命令mvn deploy发布artifact到远程仓库中。
[5]启动Apache服务器,通过地址http://Host/maven2/repo,就可以看到刚刚发布artifact了。
updating...
向本地仓库安装文件
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>-DgeneratePom=true -DcreateChecksum=true(需要使用maven-install-plugin 2.2-SNAPSHOT)
打包时,不在META-INF中生成maven目录
使用Maven打包(mvn package)时,默认地会在META-INF中生成一个目录maven,里面是一个pom和一个属性文件。如果不想生成这个目录,需要在POM中进行如下配置:
以对于一般应用程序打包,即制作jar包为例
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
</configuration>
</plugin>
</plugins>
</build>
如果你在打jar包(mvn package)时,报如下错误:<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
</configuration>
</plugin>
</plugins>
</build>
[INFO] Failed to configure plugin parameters for: org.apache.maven.plugins:maven-jar-plugin:2.0
Cause: Cannot find setter nor field in org.apache.maven.archiver.MavenArchiveConfiguration for 'addMavenDescriptor'
这是由于maven-jar-plugin的版本不够高(很可能是2.0版本),需要升级到最新的2.1版本。运行命令mvn -U package,会先下载最新版本,再执行打包操作。Cause: Cannot find setter nor field in org.apache.maven.archiver.MavenArchiveConfiguration for 'addMavenDescriptor'
类似的,对于制作war,ear包,只需要将artifactId换成对应的plugin(maven-war-plugin,maven-ear-plugin)就可以了。
Javadoc中文乱码
中文操作系统中,JDK1.5.0的Javadoc自动默认支持中文,而且页面中的条目名也都默认为中文显示(在之前的JDK中,这些条目名都默认为英文)。如是在这种情况下使用命令mvn javadoc:javadoc生成Javadoc,则这些条目名将成为乱码。
解决方法:让javadoc插件使用UTF16或Unicode字符集。具体配置的形式如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<charset>UTF16</charset>
</configuration>
</plugin>
</plugins>
</build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<charset>UTF16</charset>
</configuration>
</plugin>
</plugins>
</build>
Scope
Scope表示了某个依赖关系的适用范围(作用域),共有5个scope。
compile: 默认的适用范围,表示该依赖关系要应用于所有的classpath。
provided: 该适用范围非常像compile适用范围。但它表示该依赖关系已经由JDK或某个容量提供,如javax.servlet。
runtime:表示该依赖关系不用于编译阶段,而只使用于运行时阶段,如apache jakarta commons。
test:表示该依赖关系并不用于实际的应用程序本身,而是该应用的测试程序的编译与运行,如junit。
system:该依赖关系类似于provided,但必须显示地表示是哪一个容器提供了这个artifact。无法在仓库中找到该artifact。
注意:
[1]具有compile或runtime适用范围的依赖关系中的jar文件,制作war文件时将会被放入WEB-INF/lib目录中。
[2]不推荐使用system适用范围。
将mvn.bat配置为Eclipse外部工具
为了能够在Eclipse环境中运行mvn.bat,需要将它配置为一个外部工具(external tool)。在我的Eclipse Weed(配置外部工具)一文中已经提到了如何配置Eclipse External Tools(可先参见该文)。本主题将具体讲述如何将mvn.bat的package Build周期短语配置为外部工具。
[1]主菜单Run-->External Tools-->External Tools...
[2]先选中Program项,再点击左上角的New launch configuration按钮
[3]Name文本框中输入该外部工具的名称“MvnPackage”
[4]通过Browser File System...按钮,向Location文本框中输入mvn.bat文件的绝对路径
[5]通过Variables...按钮,选择project_loc,将向Working Directory文本框中输入${project_loc}
[6]在Augments文本域中输入package
这样当你选中一个pom.xml文件后,再运行该外部工具,就相当于对该POM文件文件执行mvn package命令。
制作war文件时,过滤文件
使用maven-war-plugin制作war文件时,它会先将所有可能用于制作war的内容放入target/artifactId-version目录(标准目录结构)下,然后再将这些文件进行打包。这样就有两种方法进行文件过滤:[1]使期望被过滤的文件一开始就不被放入target/artifactId-version目录,即使它成为不可能的文件;[2]在制作war文件时,不将期望被过滤的文件加入包中。
[1]实现第一种方法,要对dependency进行配置。将不希望加入包的artifact放入exclusion参数中,如下脚本所示:
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<exclusions>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
</exclusions>
</dependency>
[2]实现第二种方法,要对maven-war-plugin进行配置,将不希望加入包的资源文件(不再称之为artifact)放入warSourceExcludes参数中,如下脚本所示:<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<exclusions>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.1</version>
<configuration>
<warSourceExcludes>WEB-INF/lib/dom4j-1.4.jar</warSourceExcludes>
</configuration>
</plugin>
</plugins>
</build>
注意:上述方法都不仅仅是过滤掉dom4j的jar文件,它还会过滤掉dom4j所依赖的其它文件(artifact)。<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.1</version>
<configuration>
<warSourceExcludes>WEB-INF/lib/dom4j-1.4.jar</warSourceExcludes>
</configuration>
</plugin>
</plugins>
</build>
当加载插件时抛NullPointerException
如果仓库中有某个插件的jar文件有问题,则会抛出这样的异常。遇到这样的问题时,必须将这个有问题的插件清除。
可以在执行参数中加上-X(如mvn -X compile)来获得加载插件的过程,从中可能会发现问题插件。如果还不行,则使用一个新的仓库,再次执行工程。
Install或Deploy源代码
<project>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
使用如上的脚本即可,但该脚本只能针对jar文件,而不能针对war或ear...文件。maven-source-plugin并没有提供install或deploy Web工程源代码的goal。<build>
<plugins>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在命令行中设置本地仓库
在使用Maven2命令(mvn)时,可以设置本地仓库的路径,该路径将会替代settings.xml中设置的本地仓库路径。
如命令,mvn -Dmaven.repo.local=Another_Local_Repo package
注:在Maven1中还可以通过-Dmaven.repo.remote设置远程仓库,但目前在Maven2中还不行。
在Maven发行包中找到Super POM文件
所有的POM都默认继承Super POM,该POM定义了Maven标准目录结构。但在Maven的发行包中,这个Super POM是存放在了哪里呢?
这个POM就存放在maven-project的jar文件中。在笔者的机器中,该Super POM的位置是:
Maven_Home/lib/maven-project-2.0.4.jar/org/apache/maven/project/pom-4.0.0.xml
构建Maven远程仓库
构建Maven远程仓库的方法很多,也很简单。常用的Web服务器(Apache,JBoss,Tomcat,...)都可以用于构建Maven远程仓库;而发布artifact时,也可以使用多种协议(FTP,SFTP,SSH,...)。
此处使用RedHat AS 4.0 + Apache2.0.59,并应用SSH协议向远程仓库发布artifact。
[1]在Apache的DocumnetRoot中新建目录maven2/repo,此处该目录的绝对路径为
/usr/local/apache2/htdocs/maven2/repo
[2]在本地Maven的settings.xml文件中设置Server,语句的形式如下:
<servers>
<server>
<id>myrepo</id>
<username>myuser</username>
<password>mypasswd</password>
</server>
</servers>
myuser/mypasswd是登录远程Linux系统时使用的用户名/密码。
[3]在本地工程的pom.xml中进行如下形式的设置:
<distributionManagement>
<repository>
<id>myrepo</id>
<url>scp://Host/usr/local/apache2/htdocs/maven2/repo</url>
</repository>
</distributionManagement>
此处id必须与前面设置的server中的id一致;scp是使用SSH协议的文件传输命令;Host是远程Linux服务器的IP地址或域名;/usr/local/apache2/htdocs/maven2/repo就是Maven仓库在远程服务器中的绝对路径。
[4]在本地中使用命令mvn deploy发布artifact到远程仓库中。
[5]启动Apache服务器,通过地址http://Host/maven2/repo,就可以看到刚刚发布artifact了。
updating...
0 0
- maven - Maven Weed
- Weed
- weed
- Maven
- Maven
- Maven
- maven
- Maven
- Maven
- maven
- maven
- maven
- maven
- Maven
- maven .
- Maven
- maven
- maven
- AwesomePlayer的准备工作
- 如何在iOS地图上高效的显示大量数据
- Sharepoint lookup字段的关联列表查询
- 明星煤老板的喜与忧
- 【分享】娱乐圈大V微博信息数据
- maven - Maven Weed
- ftp
- 现在就开始使用AngularJS的三个重要原因
- OSTREAM
- UIView的常见属性
- 用Android-X86和VirtualBox打造高性能Android开发环境
- vim中插件ctags配置
- 鸢尾花分类算法实现 java
- aspnet_regiis命令使用