`

maven一些问题

 
阅读更多

1. The container 'Maven Dependencies' references non existing library

解决方法,将eclipse中maven插件中“resolve dependencies from workspace projects”的选项取消

 

默认的本地库更改,修改maven_home\conf\settings.xml中localRepository的配置

 

[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (...). Please verify you invoked Maven from the correct directory. 

到有pom.xml文件的目录下执行命令

 

 

2.      myeclipse从svn导入maven项目,有modules。

myeclipse的check out maven projects from scm,没有试成功怎么导出。但可以先从svn检查maven项目,包含子module,然后再导入exists maven projects。

 

3. Failure to find xxx:jar:1.0 in ... was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced

      这是一些jar包在之前的仓库无法获得,在更改仓库后,或把jar包部署到了私服上后,仍然出错。这时把.m2 文件夹下对应的 xxx.lastUpdated文件再更新依赖,就可以了。或者使用mvn命令时加 -U参数,忽略xxx.lastUpdated。

 

      另外以上方式仍然报错,这时可能是maven 库或私服里确实没有对应的jar包,这时可以在私服里增加仓库,或者更改仓库。

 

4.      pom聚合的install,在maven 的build config里,goals选项里填入install,profiles中填入maven聚合项目中配置的modules profile的id,如果是如下配置:

<profiles>

   

   <profile>

     <id>modules</id>

     <modules>

    <module>modules/parent</module>

    <module>modules/common</module>

    <module>modules/entity</module>

    <module>modules/ejb</module>

    <module>modules/spring</module>

    <module>modules/hibernate</module>

    <module>modules/web</module>

    <module>modules/test</module>

    </modules>

   </profile>

 </profiles>

则这里就要填入modules

 

5.  maven install的plugin找不到,比如effective pom 中配的是2.3.1,本机上已经有2.2.1了,是不会使用的。就会去maven仓库中下载新版本,maven 的中央库连接经常不稳定。一般会在settings.xml中配置一些镜像。但maven不会依次去尝试所有镜像,而当排在前面的镜像失效、或不能提供最新版本时,就需要调整镜像的位置。

 

6.  导入的maven项目找不到jdk中的类

jdk版本是1.6,ide是ide出问题了,将Myeclipse重启ide,对有依赖的maven项目进行更新maven依赖、更新maven项目配置操作,然后对本项目clean、 重新build后就可以了。

 

7.  拷贝依赖包 mvn dependency:copy-dependencies,默认会拷到项目的 target\dependency 目录,想要复制到自定义的目录比如target/libs目录下,需要在pom.xml文件中添加设置覆盖默认设置:

<build> 

    <plugins> 

        <plugin> 

            <artifactId>maven-dependency-plugin</artifactId> 

            <configuration> 

                <outputDirectory>${project.build.directory}/lib</outputDirectory>

                <excludeTransitive>false</excludeTransitive> 

                <stripVersion>true</stripVersion> 

            </configuration> 

        </plugin> 

其中${project.build.directory}是maven变量,表示target目录。如果不写的话,将在根目录下创建lib目录。

excludeTransitive,表示是否不包含间接依赖的包;

stripVersion表示复制的jar文件去掉版本信息。

如果需要在其他过程,比如package中加入copy-dependencies,需要在该plugin标签中这样设置:

 

<executions> 

    <execution> 

        <id>copy-dependencies</id> 

        <phase>package</phase> 

        <goals> 

            <goal>copy-dependencies</goal> 

        </goals> 

        <configuration> 

            <outputDirectory>libs</outputDirectory> 

            <excludeTransitive>false</excludeTransitive> 

            <stripVersion>true</stripVersion> 

        </configuration> 

    </execution> 

</executions>

 

8. 导入jar包到本地库

      有时候有些第三方就是从仓库中下载不下来,配的私服也有问题,就只有手动导入jar包了。Myeclipse 10 可以使用“Myeclipse -- utilities -- Maven4MyEclipse -- import jar to local repository”工具,导入jar包到本地库。eclipse的m2eclipse插件暂时没找到这样的工具。使用maven命令的可以这样:

mvn install:install-file 

-DgroupId=com.danga 

-DartifactId=memcached 

-Dversion=2.0.1 

-Dfile=java_memcached-release_2.0.1.jar (或者/d:/java_memcached-release_2.0.1.jar)

-Dpackaging=jar -DgeneratePom=true

This will add the memcache jar into your local Maven2 repository under groupId com.danga and artifactId memcached, you can then edit your pom.xml adding this dependency.

 

However, the maven eclipse can not recognize it since it always search from public repository .

 

安装到私服

    mvn deploy:deploy-file -DgroupId=org.apache.hadoop  -DartifactId=hbase -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id]

 

批量导入jar

    直接拷贝文件至/opt/data/nexus/sonatype-work/nexus/storage/pvinsight/org/apache/hadoop/hive/hive-exec/0.5.0

    或者

    通过脚本执行 mvn deploy:deploy-file  

 

9. 使用maven发布时,报某个类找不到,原因是某个运行时的类,import了用于测试的类(但并未使用),比如junit相关的类。这样,在ide中和maven compile时都不会报错,在打包时,由于junit这样的jar的scope是test类型,因此就不会包含进来,于是就出错了。解决方法就是删除不不要的引用。

 

10. 使用mvn compile命令,出现

错误: 编码GBK的不可映射字符

不能编译。这是因为代码或注释中存在中文引起的,一般在ide中会自动处理编译时的字符集,就不会碰到这个错误。这个错误是在生成代码后,其中自动加上了中文注释,手动删除中文注释处理这个问题太麻烦。这个错误是在命令行执行编译命令才出现的,需要设置编译的字符集,设置方式是:

maven编译文件的编码设置如下:

<plugin> 

    <artifactId>maven-compiler-plugin</artifactId> 

    <configuration> 

        <source>1.6</source> 

        <target>1.6</target> 

        <encoding>UTF-8</encoding> 

    </configuration> 

</plugin> 

<encoding>UTF-8</encoding>,如果不设置的话会用本地操作系统的编码来编译文件。

资源文件的编码设置如下:

<plugin> 

    <groupId>org.apache.maven.plugins</groupId> 

    <artifactId>maven-resources-plugin</artifactId> 

    <version>2.3</version> 

    <configuration> 

        <encoding>UTF-8</encoding> 

    </configuration> 

</plugin>

设置好maven-compiler-plugin编码再运行mvn compile就没有这个错误了。

 

11. maven打包时,SNAPSHOT类型的依赖包,会加上时间戳,像下面这样

xxx-1.3.0-20121225.012733.jar

如果不想用时间戳,始终使用SNAPSHOT,xxx-1.3.0-SNAPSHOT.jar这样的,需要使用<useUniqueVersions>false</useUniqueVersions>配置。在assemble插件里有描述:http://maven.apache.org/shared/maven-archiver/examples/classpath.html。而有完整例子的在这个日文网站http://kenichiro22.hatenablog.com/entry/20110908/1315481232

<build>

<plugins>

 

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

 

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-jar-plugin</artifactId>

<configuration>

<archive>

<manifest>

<addClasspath>true</addClasspath>

<classpathPrefix>lib/</classpathPrefix>

<mainClass>com.xxx.Main</mainClass>

<useUniqueVersions>false</useUniqueVersions>

</manifest>

</archive>

</configuration>

</plugin>

 

</plugins>

</build>

这样打包后jar文件中的MANIFEST.MF文件中的依赖描述就是用SNAPSHOT而不是用时间戳了。

 

12. 打包时包含svn版本信息(参考http://my.oschina.net/bayuanqian/blog/110298?p=1),配置如下:

<plugin>

    <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>

    <artifactId>svn-revision-number-maven-plugin</artifactId>

    <version>1.13</version>

    <configuration>

        <verbose>true</verbose>

        <entries>

            <entry>

                <prefix>prefix</prefix><!--自定义前缀名,与properties文件保持一致即可-->

                <depth>empty</depth>

            </entry>

        </entries>

    </configuration>

    <executions>

        <execution>

            <phase>validate</phase><!--需定义package之前的生命周期-->

            <goals>

                <goal>revision</goal>

            </goals>

        </execution>

    </executions>

    <dependencies>

        <dependency>

            <groupId>org.tmatesoft.svnkit</groupId><!--svn1.7之后才需要配置-->

            <artifactId>svnkit</artifactId>

            <version>1.8.10</version>

        </dependency>

    </dependencies>

</plugin>

外层还需要配置

<resources>

    <resource>

        <directory>src/main/resources</directory>

        <filtering>true</filtering><!--此项为true才会替换properties文件中的占位符-->

    </resource>

</resources>

然后配置文件中可以使用如下占位符

repository = ${prefix.repository}

path = ${prefix.path}

revision = ${prefix.revision}

mixedRevisions = ${prefix.mixedRevisions}

committedRevision = ${prefix.committedRevision}

status = ${prefix.status}

specialStatus = ${prefix.specialStatus}

上面revision是svn库最新的版本号,committedRevision是当前项目的最后提交版本号。因此使用committedRevision代表当前项目的最新版本号。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics