Intellij IDEA 创建使用Maven管理的Web项目的三种方式
前言
曾经混过的,都需要偿还。
环境准备
IDE:Intellij IDEA 2018.2 64位专业版
Maven:3.5.4
Tomcat:9
JDK:10
概述
现在项目大多使用Maven管理,就我现在的理解,Maven是一个构建工具,可以管理项目模块之间的依赖关系,有了它,我们不需要到处寻找各种jar包,当所依赖的jar包需要更新时,不需要一个个去lib覆盖;Maven所涉及的知识和理念以及其强大之处必然不限于这些,有兴趣的伙伴可以自行深入了解~
这里我们将介绍使用Intellij IDEA创建Maven管理的Web项目(简单返回百度首页)的三种方式:
- Web+Maven
- Maven+Web
- Maven
第一种方法 Web+Maven
在这种方式里,我们将首先创建一个Web项目,然后向其添加Maven支持。具体步骤如下:
-
使用IDEA创建Web项目
-
修改项目结构
原来结构如下:
这里,首先将src目录取消源码根目录标记:
然后在src下创建main文件夹,并在其内创建java和resources文件夹,之后通过Mark Directory as 菜单项分别将其标记为Sources Root和Resources Root。于main同级,创建test目录,然后在其中创建java文件夹,将其标志为Test Sources Root。这个结构是Maven所要求的~
-
添加Maven支持
与src同级,创建pom.xml文件(该文件内容其实是来自第二种方法里IDEA创建的pom.xml文件),然后点击右侧Maven Projects按钮,点击+添加Maven 支持:
选择我们创建的pom文件,最后结果如下:
-
配置Tomcat
这里,为了让项目run起来,需要配置一下Tomcat,值得注意的是,因为我们首先创建的是一个Web Application,所以这里IDEA为我们做了一些事情(虽然,并没有什么用,至于为什么,请关注文末后记部分)
我们点击Tomcat旁边的倒三角,点击Edit Configurations,可以看到:
嗯,看一看就好,接下来我们进入Project Structure,结果如下:
可以发现,IDEA自己创建了一个Artifact,需要注意的是它的目录结构。这就使得run的时候,会发现run不起来。 -
修改Artifact
我们这里把它删掉,点击-就行。然后我们自己创建一个。
最后结果如下:
这里需要注意的是它的结构。我知道需要这么做,是因为不这么做,就会发现run的时候会出错,而出错原因正是前者没有lib,所以找不到一些类。可以不修改,然后自己试一试(不保证一定会出现问题哦,bug这回事,谁说的准呢?) -
编写pom.xml和Controller
为了测试Maven的确管理了我们所以来的第三方包,我们编写一个Servlet,用以返回百度的首页,这里我们使用OkHttp3+Servlet 来实现,需要注意的是,IDEA不会自己引入Servlet相关包,所以我们需要添加对servlet的依赖。
pom.xml如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>xiaomo</groupId> <artifactId>aslx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>aslx Maven Webapp</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.11.0</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>aslx</finalName> <pluginManagement> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
package controllers; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class BaiDuController extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp){ try { OkHttpClient client = new OkHttpClient.Builder().build(); Request baiduHomeRequest = new Request.Builder() .get() .url("https://www.baidu.com/") .build(); Call homeCall = client.newCall(baiduHomeRequest); Response homeResponse = homeCall.execute(); String content = homeResponse.body().string(); PrintWriter writer = resp.getWriter(); writer.write(content); }catch (Exception e){ e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
-
最后结果如下:
我们发现中文乱码,其实也很正常,我们没做关于字符集编码的设置,所以乱码了,关于乱码,可以看看这篇文章。
至此,第一种方法工作正常~
第二种方法 Maven+Web
在这种方法里,我们将先创建一个Maven项目,然后添加Web模块;
-
使用IDEA创建Maven项目;
注意,不要勾选create from archetype选择框哦;然后,默认结构如下:
这里的结构,也就是我们在第一种方法里所模仿的结构;
-
添加Web模块;
进入Project Structure,选择Modules,然后点击+号,选择Web:
-
创建Artifact
完成第二步时,你会看到如下图所示的界面:
按箭头操作即可; -
选择默认,点击ok
这里,需要注意的是,如果你展开WEB-INF,会发现没有lib,而且是Web exploded哦!当然,这是我后来才意识到的,所以截图中没有显示;然后点击Apply。(后面我们再修改~); -
添加Web结果如下
-
配置Tomcat
进入,然后得到界面如下:
按箭头操作即可;然后会是这样的:
这是因为我们没有选择部署的Artifact(我们刚刚添加Web结构的时候,按照IDEA提示创建了一个Artifact),这里点击fix即可;然后,点击ok退出,把web.xml、pom.xml、Controller拷贝一下,这很重要哦,然后run,接着就会出错原因在第四步提到了
-
修改Artifact
进入Project Structure,然后选择Artifact,将创建的Artifact删除,然后点击加号,新建一个。
结果如下:
这次,我们创建的是一个war exploded:它包含lib!而原来的Web exploded,好像再也找不到了。 -
修改Tomcat 配置
点击-,然后点击+,就会出现我们修改后的war。 -
这下可以run了。
嗯,还是熟悉的乱码值得注意的是,如果在修改Artifact的时候,controller没有到位的话,创建的WEB-INF下还是没有lib。这样就可以理解为什么IDEA创建了一个不能run的Artifact:创建Artifact的时候,java下是没有代码的,大胆猜测,如果先把Controller等文件写到相应位置,说不定就ok了。但我没去尝试哦;
第三种方法 Maven
在这种方法里,我们你将通过Maven+Archetype的方法创建Maven Web项目
-
使用Intellij IDEA创建项目
值得注意的地方都标出来了;哈哈哈,其实最重要的是把create from archetype 选择框选上~ -
默认结构
-
模拟Maven项目结构,创建java、resources等文件夹,操作同第一种方法;
-
填充Controller、web.xml、pom.xml等信息
-
配置Tomcat
操作同第二种方法中的配置Tomcat,在deployment选项卡下,点击fix,此时会有两个选项,war和war exploded,我们选择war就好,值得注意的是,这两个Artifact是IDEA创建的
-
然后run
后记
从以上各种方法来看,第三种方法最统一,因为IDEA创建的Artifact是ok的,而第一二种方法里都涉及到对Artifact的修改,其核心问题是对WEB-INF下lib文件的处理,我们知道Web项目里依赖的第三方库都会在lib中去寻找,没有lib,自然会报找不到类的错误。