Maven实战

1. maven工程导入Eclipse后,发现包都是文件夹图标;原来是因为需要在eclipse中配置maven的setting文件;也是此时才体会到:当多个eclipse都要配置maven的时候,最好是为每一个都指定一个setting文件,如果都是指向%MVN%/config/settings,那么修改此文件将会影响所有的eclipse项目。

2. 阿里云Maven库地址:

http://maven.aliyun.com/nexus/content/groups/public
http://mvnrepository.com/
http://repo1.maven.org/maven2

3. 下载依赖包总是80-90%后失败

   杀毒软件阻碍了下包;下载jar包发现,总是快要下完了,卡在了那个地方,后来想到是不是因为卡巴斯基啊,于是关停了卡巴斯基,完美解决;

4. 多个中央仓库
  之前主要是玩maven的settings,但是在settings里面只能指定一个仓库;如果想要发现下载失败就换一个仓库,可以在pom文件中这件事情(settings里面可以注释掉):
 <repositories>
        <repository>
            <id>aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
        <repository>
            <id>maven_uk</id>
            <url>http://uk.maven.org/maven2/</url> 
        </repository>
        <repository>
            <id>jBoss</id>
            <url>http://repository.jboss.org/nexus/content/groups/public</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/cloudera/cloudera-repos</url>
        </repository>
      <repository>
            <id>maven2</id>
            <url>http://repo2.maven.org/maven2/</url>
        </repository>
    </repositories>

 5.maven的快速失败机制

  pom中定义了一个oracle:jdbc6无法下载导致后续的下载失败;maven的下载机制中,一个失败可能导致后续的jar包下载停止;
6. 下载一部分后失败要删除再下
  明明在central maven上面有spark-core_2.11:1.6.0的jar包,但是我通过intelliJ就是死活下不来。
  后来发现在repository(.m2/repository)中其实已经有了这个这个jar包,但是里面充斥着update文件,说明下载失败过。把spark-core2.11的目录上除掉之后,再删除,完美。
 7. Maven自动下载源码功能
如果想要查看某个类,如何能够自动下载源码jar包呢?
其实你什么都不需要做;但是如果你想要在指定jar的时候做些什么得话:
下面这些方法是在网上找的,但是我觉得技术不做这些事情,仍然可以自动下载,我是指当通过ctrl点击某个类之后,跳转到熟悉的没有source的类汇编的界面之后,eclipse已经开始自动下载了。
 
方法一:只需要在pom文件中,增加如下内容即可,这种方法比较适合在团队中,因为只是配置pom文件,eclipse不需要做配置:
<project>
  <properties>
    <downloadSources>true</downloadSources>
  </properties>
</project>
  方法二:windows->Preferences->maven->勾选上Download Artifact Source即可。
8. 记一次Maven问题解决
  刚才调试了大半天,就是发现为什么maven web项目突然启动失败了。之前都是好使的。
  因为之前项目是maven的父子关系;后来觉得没有必要搞神马父子关系,于是就把这种关系给删掉;但是悲催的是在设定父子关系的时候,我把groupid(以及version给删掉了),因为我在生命父级节点信息的时候,指定了groupId,于是pom文件报错,说是父级已经设定,子级就不需要了。于是我给删了。
  后来不用之后我把pom中声明父级节点的内容删掉了;但是此时pom就报错了;我也没理会,直接起tomcat于是,报错;但是我就把这个茬给忘记了;也没有细看pom哪里报错,就是一顿瞎调。其实你只要通过pom 的编辑器查看,是可以看到报错的原因的。这个切机被我给忽略了,导致后续的高成本的查找。这个问题解决的关键就是:要知道pom报错,应该通过pom编辑器来确定哪里出问题了。
  要知道哪里出问题,是解决问题的指导。
9. invalid LOC header (bad signature)
  这个异常明显是因为jar包损坏了。
  可以通过maven test指令来定位发生的地方;但是奇怪的是只是第一次的时候准确的报错了,告诉是因为yarn-resource.jar的LOC异常,之后的执行都通过了;奇怪,因为添加了hive-shim的依赖,hive-him依赖于yarn-resource.jar,后来直接在部署路径下删除,编译通过。
  后来发现原来是因为首先需要mvn clean一下,然后在mvn test;这样就可以重现出现问题的jar包
10. maven还是要连到仓库
  maven还是要连接点仓库或者私有仓库(例如Nexus),否则只是本地的.m2的仓库在新搭建项目的时候还是不可以。
  我因为开始在pom文件中没有设置repositories信息,导致了后续的一列cloudera包依赖无法识别(本地仓库已经存在该jar包);添加上了cloudera的资源仓库地址后,问题解决;我在想或者通过Nexus应该也可以;反正本地的.m2仓库是不足以做新引入包的处理。
11. maven项目间的引用正确姿势
  1)添加项目引用(在build path中添加);然后(如果是Web项目)在Assembly Deployment中添加项目引用,目的是部署(到tomcat,或者war包)的时候,将引用工程的jar包打到lib下面;缺点是每次maven工程pom文件变化,将会导致Assembly Deplyment的引用关系丢失;
  2)在maven中引用静态路径,这种方式只是支持web工程,而且前提示将WEB-INF/lib添加到Assembly Deployment里面(该方式主要适用于引入非仓库的jar包);缺点是引用工程的变化无法及时体现出来,每次都需要打包手动拷贝到WEB-INF/lib下面;
1         <dependency>
2             <groupId>org.apache.ambari</groupId>
3             <artifactId>groovy-client</artifactId>
4             <version>2.0.0.0-SNAPSHOT</version>
5             <scope>system</scope>
6             <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/groovy-client-2.0.0.0-SNAPSHOT.jar</systemPath>
7         </dependency>

   3)保证和引用工程在同一个workspace下面,直接maven引用即可:

1         <dependency>
2             <groupId>org.apache.ambari</groupId>
3             <artifactId>groovy-client</artifactId>
4             <version>2.0.0.0-SNAPSHOT</version>
5         </dependency>

    第三种方法是我最后才知道的。

12. maven的terminal窗口默认路径

  之前一直苦恼于terminal窗口的默认路径是用户文件所在路径;
  其实只要在右键工程-> show in terminal默认路径就是工程所在的路径!
13. maven的聚合工程从svn/git导入
  你创建了一个父级maven工程(maven project);然后你再创建一个子级工程(mave module),那么子工程自动建在父级工程文件夹下面;
  当你上传到svn上面一个父级工程的时候,自动会把子级工程上传。这个设计很给力,直接自工程置身于父工程的文件夹下面,便于管理。
  但是对于聚合项目,从本地导入聚合工程(multi-module project),是没有问题,如果从svn上面直接下载聚合工程,只下载project,module工程则不见了(藏在project工程中,作为普通文件夹出现)。
  解决办法:
  1)从svn下载之后(import->SVN),先从Eclipse中删除该工程
  2)然后在eclipse中导入刚才下载的工程代码(import -> Maven -> Existing Maven Projects),只需要选择parent文件级别即可一次性导入关联工程(例如选择springcloud-parent文件夹,即可导入springcloud-eureka,springcloud-app等关联工程)。
  后来在使用git的时候,类似,maven的强大我是再次领略了;本地的maven多模块工程上传,只需要选择parent工程上传即可。
只是,你要把原工程删掉,因为你会发现原工程的子模块模块并没有纳入到git管理(因为你只是上传了parent工程),只有从github上面下载的工程才有全局管理:(
14. maven的jdk要求
  org/apache/maven/cli/MavenCli : Unsupported major. minor version 51.0
  我本地jdk版本配置的是1.6;然后maven的版本是3.3开始只支持1.7以上,所以要下载3.3以下的版本才可以配合jdk1.6;
15. maven只要是更新,就会自动把jdk版本改为JSE1.5
  后来在pom中增加如下内容,问题解决:
 1 <build>
 2     <plugins>
 3         <plugin>
 4             <artifactId>maven-compiler-plugin</artifactId>
 5             <configuration>
 6                 <source>1.6</source>
 7                 <target>1.6</target>
 8             </configuration>
 9         </plugin>
10     </plugins>
11 </build>
  maven-compiler-plugin类似于java project里面指定compile level;但是如果你使用maven进行编译打包,它的compile level是由maven-compiler-plugin来决定的。
  可选等同写法:
1 <properties>
2     <maven.compiler.target>1.6</maven.compiler.target>
3     <maven.compiler.source>1.6</maven.compiler.source>
4 </properties>
参考:
16. Java compiler level does not match the version of the installed Java project facet
  我的java版本是1.6,Dynamic Web module是2.3。
  在pom文件中添加maven-compiler-plugin插件(参见代码参见上面方案),maven -> update project,错误消失。
17. MAVEN的工程引用和仓库引用
  如果maven的pom文件配置同一个eclipse workspace下面两个项目引用,要注意了,默认情况下被依赖的工程的所有pom重定义的jar包将会被设置为“export”;作为主工程会不由自主的增加很多自己的pom文件并未定义的jar,是的,他们来自于被依赖的工程;这里就有一个隐患,如果是在私有仓库的环境下,你打包并上传了,但是它的依赖可能并没有放到私有仓库里面;这里就有问题,其他工程引用了该jar包,因为不是工程引用,所以会出现jar包找不到的问题。你会奇怪,为什么我本地引用并不需要在pom文件中定义依赖,但是到了非工程依赖的情况下,就找不到类了,就是因为这个原因。
18. maven工程生成source源码jar包
 1 <build>
 2     <plugins>
 3         <plugin>
 4             <groupId>org.apache.maven.plugins</groupId>
 5             <artifactId>maven-compiler-plugin</artifactId>
 6             <version>3.5.1</version>
 7             <configuration>
 8                 <source>${java.version}</source>
 9                 <target>${java.version}</target>
10                 <testSource>${java.version}</testSource>
11                 <testTarget>${java.version}</testTarget>
12             </configuration>
13         </plugin>
14         <!--配置生成Javadoc包-->
15         <plugin>
16             <groupId>org.apache.maven.plugins</groupId>
17             <artifactId>maven-javadoc-plugin</artifactId>
18             <version>2.10.4</version>
19             <configuration>
20                 <encoding>UTF-8</encoding>
21                 <aggregate>true</aggregate>
22                 <charset>UTF-8</charset>
23                 <docencoding>UTF-8</docencoding>
24             </configuration>
25             <executions>
26                 <execution>
27                     <id>attach-javadocs</id>
28                     <goals>
29                         <goal>jar</goal>
30                     </goals>
31                 </execution>
32             </executions>
33         </plugin>
34         <!--配置生成源码包-->
35         <plugin>
36             <groupId>org.apache.maven.plugins</groupId>
37             <artifactId>maven-source-plugin</artifactId>
38             <version>3.0.1</version>
39             <executions>
40                 <execution>
41                     <id>attach-sources</id>
42                     <goals>
43                         <goal>jar</goal>
44                     </goals>
45                 </execution>
46             </executions>
47         </plugin>
48     </plugins>
49 </build>
 
 
 
原文地址:https://www.cnblogs.com/xiashiwendao/p/7093094.html