Eclipse下maven使用的常见问题及scope详解
前言
在Eclipse下使用Maven,着实有些不足之处,以至于经常有人问到Maven相关的问题,故此在这里做个总结,以便大家查阅。有的涉及原理的东西,也一一讲解,这样能举一反三。
怎么创建Maven项目
eclipse支持maven项目的创建,如果你希望不要等待那么久,直接跳过架构选择即可,但是你需要清晰地知道Maven的项目结构,他应该是这个样子: Eclipse中的Maven项目对
文件夹的结构解析是自动的,对应的关系如上图。 如果你创建的项目的结构不是如此,可以手动添加对应文件夹,Eclipse可以自动识别。注意所有文件夹的创建都应该在src下。当然,SpringBoot的web内容是直接仿到resouces下面的,那是SpringBoot内置的对静态资源的处理。
如何设置JDK版本
很多人发现创建完的Eclipse的Maven项目,在Project Facts中看到的Java的版本居然是1.5这个上古时代的版本,实际上我们只需要在Maven中添加这么一段代码就可以了:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
项目菜单中的Update Project是什么原理
Eclipse实际上对Maven的支持并不算完备,其中一个特点就是Eclipse仍按照自己的方式来管理Maven项目,当我们修改了POM配置后,Maven并不能自动读取理解。而且Eclipse会尝试通过POM配置自动匹配一些Eclipse内置配置,比如尝试为web项目自动添加webService的支持等。 修改pom后,单击项目右键选择Maven->Update Project的功能就是读取POM配置并使用Eclipse的方式来更新项目的配置。比如,上面的修改Java版本的代码改动后,你就应该执行这个操作: 简单说来,所有pom文件的更新,如果没有及时反馈到Eclipse的项目属性中,你都可以执行这个菜单,快捷键为alt+ F5。
从哪里搜索依赖,如何选择版本
原来的maven.aliyun.com是可以搜索包的,但是现在只能作为库使用了。搜索库,最佳去处,自然是https://mvnrepository.com/,搜索后直接复制pom就可以了。
关于版本选择问题,一方面要考虑版本之间的冲突,这是第一原则。其次,如果有多个版本可选(比如日志框架),那么选择下载次数最多的基本不会错,如下图:
什么时候需要设置scope
scope是对dependency的管理措施,scope的可用值有下面几个:
1、 compile 这是默认的scope,表示在运行,打包,测试几个声明周期中,对应的jar包都是存在可用的,最典型的是如果你设置了某个dependency的scope不为compile,则你会发现打包后war文件中没有对应的jar包。
system 这个scope可以用来引用maven库无法下载的包,比如你公司自己的jar包,如果没有maven私服,这是一个快捷的解决办法,典型的例子是谷歌的验证码插件:
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
大家可以尝试后发现提示无法直接下载,解决的办法是https://mvnrepository.com/中搜索到对应版本后找到jar包下载,然后放到项目的某个文件夹中,用下面的代码实现引用:
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/kaptcha-2.3.2.jar</systemPath>
</dependency>
3、provided provided表示将来的运行环境会提供该jar包,它在编辑代码时段,maven打包阶段都可用,但不会打包到结果中,比如tomcat自带的包,比如servlet-api,可以这样写:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
这样就不用使用eclipse的方式也就是添加对tomcat运行时的build path了。
4.
test表示引用的jar包仅在测试类中有效,比如下面的两张图说明了这个问题:Eclipse认识不同的作用域。
当然test scope的jar包也不会被打包到结果包中,比如war中。
5、runtime 这个作用域用来表示该jar包仅在运行时可用,及在编译打包期间不需要,与compiler相比,仅跳过编译步骤。
Maven的源设置及本地仓库设置
本地仓库,默认存放缓存位置是在C盘,C盘是多么重要的地盘,maven依赖不小哇,动不动就是几个G,所以还是将其转移吧,代码参考下面的讲述。 使用aliyun的maven源仍然是最快的,设置的办法有两种,一个是修改eclipse的maven设置中的settings.xml:
<?xml version="1.0" encoding="UTF-8"?><settingsxmlns="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">
<localRepository>D:\mavenrepo</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors> </settings>
一个是在pom中添加源设置(pom的根节点下):
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
需要和原创作者沟通交流技术,或者说有问题需要帮助解答的话,可以留言回复,大家也可以关注我下 以后给大家带来更多的精彩内容