前言
前前后后折腾Maven也两三天了,初步想法是将我的javaweb项目转用Maven进行管理,
在转移的过程中遇到许多问题,记录一下以备后用~
IDE:idea 2020.1.1
Maven:apache-maven-3.6.3
补充一个问题零:警告:No archetype found in remote catalog. Defaulting to internal catalog.
解决方案:在maven的VM Options加上-DarchetypeCatalog=internal参数。
问题一:用webapp骨架建立Maven项目会导致结构不全
实测可知,创建后无java,resources和test目录。需要手动创建目录,并右键->Mark as选择目录类型。
解决的话可以不使用骨架直接创建项目,缺点是没有webapp目录,需要自己手动添加,添加方法是在项目
结构中添加Web Module。
问题二:Maven添加jar包如何实施?
Maven中jar包都是从仓库中取,用idea管理Maven项目一定要会用右侧边栏的Maven窗口,之前在POM中
添加依赖的时候没有reload,还以为不能添加servlet3.0,其实只要reload一下就解决了。

顺便说一下Maven中加jar包最简单的一个办法:去Maven中央仓库中找到你需要的jar包,复制依赖到POM再reload
就可以使用了。但是这里还有一个关于scope的小坑,就是servlet和mysql连接器这些jar包都有不同的scope,分别是provided
和runtime,其他大多数jar包都是默认就好。
中央仓库链接:https://mvnrepository.com/
还有另外一种实现方式是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 lib 文件夹下。例子使用的是 ldapjdk.jar
然后添加以下依赖到 pom.xml 文件中:
<dependencies>
<!-- 在这里添加你的依赖 -->
<dependency>
<groupId>ldapjdk</groupId> <!-- 库名称,也可以自定义 -->
<artifactId>ldapjdk</artifactId> <!--库名称,也可以自定义-->
<version>1.0</version> <!--版本号-->
<scope>system</scope> <!--作用域-->
<systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> <!--项目根目录下的lib文件夹下-->
</dependency>
</dependencies>
问题三:为什么Maven web项目连接不上数据库?
这是折磨我最长时间的一个问题,原本畅通运行的javaweb项目用Maven管理后无论如何都连接不到本地
的数据库,层层排查后发现确实是Connection值为null的原因,但是怎么解决真是废了一番功夫。下面
来详细讲一下idea中Maven管理web项目如何连接数据库:
1.常规操作,先添加依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
做完这一步,普通的项目已经可以找到数据库了,而Web项目不行。
2.原因分析
常规的tomcat部署方式是直接部署到${TOMCAT_HOME}/webapps下
但是idea用的tomcat部署不是常规的部署方式:
CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录。如果我们想要运行
Tomcat的多个实例,但是不想安装多个Tomcat软件副本。那么我们可以配置多个工作目录,每个运
行实例独占一个工作目录,但是共享同一个安装目录 Tomcat每个运行实例需要使用自己的conf、logs、temp、webapps、work和shared目录,
因此CATALINA_BASE就 指向这些目录。 而其他目录主要包括了Tomcat的二进制文件和脚本,CATALINA_HOME就指向这些目录。
在这里没有加载mysql-connector-java包,因此会报错。
3.解决办法!
选中mysql连接器的jar包后,双击放入/WEB-INF/lib,然后就能加载到lib中了。再运行即可连接数据库!

更详细的信息参考此链接:https://www.cnblogs.com/yaohuiqin/p/9836165.html
问题四:如何在Maven中配置JDK版本
用POM配置
方法一
<project>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
方法二
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
问题五:Maven创建webapp骨架无法使用@WebServlet来实现注解配置
这个是之前用骨架创建项目的一个问题,解决方案如下:
将web.xml修改成如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="false">
</web-app>
注意一定要将matadata-complete属性改为”false”这样创建的web工程才是web-4.0
然后POM导入servlet3.0以上的依赖就行了。注意provided。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
问题六:java.lang.NoClassDefFoundError: com.sun.mail.util.MailLogger
使用java.mail报错java.lang.NoClassDefFoundError: com.sun.mail.util.MailLogger,
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.0</version>
</dependency>
仍然报错,突然想起mysql连接器的窘境,添加到weblib,于是解决了。。。
到这里,我的web项目已经转移成功了。舒服~