这篇来看看如何在Eclipse上正确的基于Maven创建一个web动态项目。默认创建web动态项目是缺少内容,需要我们手动修改一下。然后来学习一下依赖中的范围。
1.Maven默认创建web工程效果
打开Eclipse,我们来创建一个maven工程,其实maven创建java工程和web工程在界面上就一个简单区别。
在packaging这里选择有三项,如果选择jar,创建的maven项目就是java工程,如果选择war,创建的项目就是web工程。这里我们选择war(一般web项目打包都打成war格式,例如Jenkins下载包为jenkins.war)
上面这个以war创建的maven工程,和你自己Eclipse版本有关系,我是2019-3月份的版本。之前我在更老的版本,创建war这种maven项目,连截图第一行,第二行这几个都不显示。
创建的项目就是这样,这个和我们常见的web动态工程项目是很不一样的。没有webContent文件夹,也没有WEB-INF文件夹,也没有web.xml文件(上面红色X报错就是没有web.xml造成的)
2.修改成正常的web工程
下面通过以下步骤,把这个maven工程改成我们熟悉的web动态工程。注意上面有一个src/main/webapp,这个文件夹下的内容就是我们平常创建web动态项目产生的webContent文件夹。
1) 右键工程,选择properties,先找到Project Facets。
2) 先右侧找到Dynamic Web Module,把前面√取消掉,点击Apply按钮
3) 然后再次把Dynamic Web Module前面的勾给勾上,勾上之后出现一个可点击的链接
4) 点击上面这个红色框内链接
点击Ok,进行保存,效果如下。
这样的话,基于Maven的web动态工程就创建好了。
3.一劳永逸修改j2ee版本
上面还是小问题,就是下图的J2EE 1.5,有些项目我们创建maven之后,这个地方显示J2SE-1.5,而我们实际JDK版本确实jdk1.8
1) 找到maven安装路径下的settings.xml文件
2) 打开settings.xml文件,搜索找到“profiles”标签,添加如下内容。
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
保存,到这里并没有确保以后创建maven工程都是JDK1.8,还需要检查一下两个配置
检查Eclipse中使用的是内嵌的maven版本还是我们自己下载配置环境变量那个,如果是内嵌,点击add,添加我们配置的这个版本,一般内嵌的版本比较旧。
点击User Settings,检查conf/settings.xml是不是我们刚刚修改的这个文件。
这样就能确保下次创建的项目全部都是J2SE-1.8的版本。如果工程已经创建,右键这个工程,选择Maven-Update project..,这样之前的J2SE1.5就变成1.8版本。
4.依赖范围
下面学习Maven的一个小知识,就是依赖范围。我们前面学习过坐标,也就是GAV,也就是下面这段。坐标就是放在依赖标签下,Maven中的依赖也是一个核心功能,我们学习只需要了解就好,这里来学习一下依赖下的范围这个小知识。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
这里多了一个scope,也就是范围的意思。这个scope就是表示这个依赖的范围。常见的值有test,compile和provided. 如果是compile,那么这行scope标签可以不写,不写代表默认就是compile。
下面我们来学习这三种依赖范围的作用效果。
我们一个Web开发项目。可以分成 开发 --》部署--》运行--》Tomcat,下面这几种范围就是在开发 --》部署--》运行--》Tomcat哪个阶段参与和不参与,有效和无效的总结。
1)compile范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与
- 是否参与部署:参与
典型例子就是:spring-core,log4j等
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
我们这里拿log4j.jar这个依赖来解释,在src/main/java和src/test/java,我们都可以使用log4j来写入日志到文件和控制台,这个scope是默认,也就是值为compile,所以对主程序和测试程序都有效。参与打包和部署,其实打包就是为了接下来部署服务的。log4j在jdk中没有这个,在tomcat服务器上面也没有这个jar包。所以我们打包需要,而且部署也需要。所以这个log4j.jar最终会部署到tomcat下的WEB-INF\lib下。
我们可以来稍后用一个web工程来测试一下这个效果。
2)test范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
典型例子就是:junit 或者TestNG
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
由于Maven工程约束和规范,你是不可以在src/main/java下创建一个类,里面是有TestNG或者Junit,这个是做不到,不信你可以试试。所以这个junit依赖范围是test,那么对主程序是无效,对测试程序是有效。也不参与打包和部署,因为我们打包和部署都是和主程序有关,和测试代码没有关系,待会我们可以web项目部署到tomcat看看junit.jar包是否复制到tomcat对应目录下。
3) provided范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
典型例子就是:servlet-api.jar
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
这个关键如何理解对打包和部署不参与。这里我们用的例子是servlet-api.jar, 也就是我们在web工程中,在webapp根目录新建一个login.jsp,如果pom.xml不写入上面依赖,就是会报错。(这里不考虑原先那种好动添加tomcat server办法)。
这种依赖范围为provided,为什么不参与打包和部署呢? 我们知道servlet-api.jar包在tomcat服务器上已经存在,所以不需要这个参与打包和部署。但是我们在写主程序和测试程序,没有tomacat环境也可以写代码,我们可以pom.xml添加这个依赖。只不过,我们无法在tomcat上运行环境而已。
上面三个jar包的依赖范围,这里用一个maven风格的web动态工程来演示效果,是否真的参与打包和部署。我们知道一旦参与了打包和部署,这个jar就会出现在tomcat服务器对应的项目的\lib文件夹中。
1) 把三面三种依赖添加到pom.xml
2)右键工程,选择maven-update project
3) 在src/main/java/webapp下新建一个login.jsp。什么都不行保存
4)右键login.jsp,run as -run on server.
根据提示,选择本地tomcat环境,点击结束,Eclipse工作区域会显示login.jsp内容。
5)到tomcat安装路径下知道这个web项目,看看lib下有没有上面出现的jar包。
所以,只有scope值是compile的依赖jar包才会参与打包和部署到web容器中。所以,根据上面知识,以后我们在看项目的pom.xml的内容,至少在<dependencies></dependencies>这对标签的内容是完成可以看懂和看明白的。