首页 > 代码库 > Maven安装及使用中的常见问题
Maven安装及使用中的常见问题
环境:win7 + eclipse mars版本
一、安装maven
1、安装maven插件
1)、下载maven并解压到指定目录,到该目录下复制当前路径path
2)、在eclipse的dropins目录下编辑maven.link,将maven所在的path填写进去:
path=D:/Program Files/DevTools/apache-maven-3.3.9
然后启动eclipse,在Window-->Prefrence窗口看到Maven的选项说明maven插件安装成功。
2、使用maven自定义的repository仓库
1)、到maven软件包的conf目录下,编辑settings.xml,填写repository的路径:
2)、到eclipse中修改默认的maven repository目录
保存退出
3)、启用maven软件包里的settings.xml
然后Update Settings
二、maven常见问题
1、pom.xml报错:
同时打开pom.xml有类似如下提示:
解决:
在项目上右击--->Maven---->Update Project--->选择出现错误的项目,然后在下方选中强制更新选项,单击OK即可。
三、Maven依赖常见问题
1、缺少依赖
现象:添加部分Maven依赖后,开发过程中代码正常编译,运行时提示缺少依赖
原因:这是因为由于各种原因,Maven没有下载全部所需要的对应依赖造成的
解决方案:按照提示添加相关依赖即可。
示例:在某个项目中,运行时,提示如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: kafka/api/OffsetRequest at storm.kafka.KafkaConfig.<init>(KafkaConfig.java:43) at storm.kafka.SpoutConfig.<init>(SpoutConfig.java:32) at cn.crxy.storm_project5.LogProcessTopology.main(LogProcessTopology.java:27)Caused by: java.lang.ClassNotFoundException: kafka.api.OffsetRequest at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
根据标示的提示信息,可知缺少kafka依赖,添加即可。(在网址:mvnrepository.com上,搜索kafka依赖,添加)
2、依赖冲突(依赖包中子依赖重复)
现象:在开发过程中,代码编译正常,运行时提示在class path中出现两个类似的依赖包
分析:依赖a-1在A中出现,依赖a-2在B中出现(A和B为项目的依赖,a-1和a-2为对应的子依赖,它们功能相同,只是版本等有所差异),系统不知道引用哪个子依赖项,所以出现此错误。
解决方案:在依赖中过滤掉多余的子依赖即可
示例:某次运行代码时,提示如下错误:
Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory at org.apache.log4j.Logger.getLogger(Logger.java:39) ~[log4j-over-slf4j-1.6.6.jar:1.6.6]
解决:在依赖中进行过滤,示意:
<!-- 因为storm中有logback的实现,kafka中有log4j的实现,需要把kafka中的log4j过滤掉 --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</artifactId> <version>0.8.2.2</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <!--如果需要过滤多个,添加多个exclusion即可 --> </exclusions> </dependency>
3、依赖冲突(代码和运行环境中依赖重复)
现象:开发好的软件包在测试服务器上运行时,提示依赖包冲突
原因:默认打包的时候,所包含的依赖包中已经有依赖A,而线上跑的集群中也有对应的依赖A,二者冲突造成此错误
解决:设置自己开发的依赖包的作用范围(级别),使其在开发编译时有效,打包时无效
示例:
<!-- 这个依赖编译时需要,运行时就不需要了,因为storm集群里面已经包含 --> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>0.9.3</version> <scope>provided</scope> </dependency>
4、一次性设置jdk的编译级别和运行级别为1.7(推荐)
在项目组开发过程中,开发工具eclipse默认的jdk编译和运行级别都是jdk1.5的,在开发过程中会造成很多问题,一个典型的例子时jdk1.5不支持注解,而在1.7版本可用。
因此需要强制指定编译和运行级别。一种推荐的解决方案为在pom.xml中指定:
<build> <plugins> <!-- compiler插件, 设定JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <!-- 源代码使用的开发版本 --> <target>1.7</target> <!-- 需要生成的目标class文件的编译版本 --> <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中需要没有使用低版本jdk中不支持的语法),会存在target不同于source的情况 --> </configuration> </plugin> </plugins> </build>
另外一种可采用的方案是在项目上右击,在Properties面板中上指定,这种方法在更新项目后,会重新恢复默认的1.5版本,所以不推荐。
Maven安装及使用中的常见问题