在Tomcat上運行Maven管理的J2EE項目

這里將創(chuàng)建一個Maven管理的J2EE項目,然后,讓其在Tomcat上運行。這里使用的是MacOS上的IDEA編輯器。

1、創(chuàng)建基于Maven的J2EE項目

1.1 創(chuàng)建Maven項目

在IDEA中依次點擊File->New->Module...,如下。

image.png

點擊下一步,輸入模塊的名稱。


image.png

然后,設置Module的存儲路徑。


image.png

點擊Finish,就創(chuàng)建了一個空Maven項目,結構如下。

image.png

1.2 設置J2EE資源目錄

這src的main目錄下創(chuàng)建一個webapp空目錄,創(chuàng)建完成之后,結構如下。


image.png

接下來,需要將這個目錄設置為J2EE資源目錄。點擊File->Project Structure...,在彈出的對話框中,點擊Modules,然后,選中剛剛新建的mvn-tmct這個模塊,點擊加號,選中Web。

image.png

接下來,添加web.xml描述文件,并設置web資源目錄,如下圖:


image.png

注意,這的web.xml的路徑是/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/web.xml
Web Resource Directory是/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp。
這一步做完之后,會發(fā)現(xiàn),前面新建的webapp圖標發(fā)生了變化,其中也多了內容。如下。

image.png

到這里,一個基于Maven的J2EE空項目就完成了。

1.3 創(chuàng)建測試頁面

在前面新建的webapp目錄下,新建一個測試頁面index.html,內容如下:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Hello World!</title>  
</head>  
<body>  
    <h2>Hello World!</h2>  
</body>  
</html>

創(chuàng)建完成之后,工程的目錄結構如下。


image.png

1.4 啟動項目

1.4.1 創(chuàng)建Artifact

點擊File->Project Structure...,在彈出的對話框中,先點擊Artifacts,然后點擊加號,選中Web Application: Exploded->From Modules...,如下。

image.png

然后,選中當前模塊:


image.png

可以看到,當前創(chuàng)建的Artifact的結構,如下。


image.png

1.4.2 運行項目

點擊Run->Edit Configurations...,然后在彈出的對話框中,點擊加號,選擇Tomcat Server->Local

image.png

點擊后如下:


image.png

選中Deployment頁簽,點擊加號,選擇Artifact...

image.png

然后,在彈出的對話框中,選中剛剛創(chuàng)建的Artifact,如下。


image.png

然后點擊OK,如下。


image.png

最后,點擊ok即可。到這里就可以,選中剛剛創(chuàng)建的Tomcat Server啟動運行,如下:


image.png

啟動之后,瀏覽器訪問http://localhost:8080/index.html,效果如下:

image.png

2、創(chuàng)建JSP并運行

這個比較簡單,和html一樣,直接新建即可。
在webapp目錄下,創(chuàng)建index.jsp,如下:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Hello World!</title>  
</head>  
<%  
    String tmpStr = "Hello World!";  
%>  
<body>  
    <h2>index.jsp: <%=tmpStr%></h2>  
</body>  
</html>

目錄結構如下:


image.png

重啟之后,訪問http://localhost:8080/index.jsp,效果如下。

image.png

3、創(chuàng)建JSP并引用Java類

在java目錄下,創(chuàng)建一個java類com.lfqy.util.Hello

package com.lfqy.util;  
  
/**  
 * Created by chengxia on 2022/11/22. */public class Hello {  
    public static String say(){  
        return "Hello World!";  
    }  
}

在webapp目錄下,創(chuàng)建indexJava.jsp,如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  
<%@page import="com.lfqy.util.*" %>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Hello World!</title>  
</head>  
<%  
    String tmpStr = Hello.say();  
%>  
<body>  
    <h2>indexJava.jsp: <%=tmpStr%></h2>  
</body>  
</html>

到這里,目錄結構如下:


image.png

重啟之后,訪問http://localhost:8080/indexJava.jsp,效果如下:

image.png

4、創(chuàng)建JSP并引用使用Maven依賴的Java類

在這個場景中,如果一個jsp中引用了一個java類,而這個java類中,也用了一個maven依賴。這種情況下,如果沒有任何處理,會直接報錯。具體如下。
首先,修改pom.xml文件,引入一個maven依賴。

<?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>com.lfqy.j2ee</groupId>  
    <artifactId>mvn-tmct</artifactId>  
    <version>1.0-SNAPSHOT</version>  
  
    <dependencies>        <dependency>            <groupId>commons-lang</groupId>  
            <artifactId>commons-lang</artifactId>  
            <version>2.6</version>  
        </dependency>    </dependencies>  
</project>

創(chuàng)建一個用于測試的java文件com.lfqy.util.HelloStringUtils

package com.lfqy.util;  
  
import org.apache.commons.lang.StringUtils;  
  
/**  
 * Created by chengxia on 2022/11/22. */public class HelloStringUtils {  
    public static String say(){  
        return "Hello World!";  
    }  
    public static String sayStringUtils(){  
        String resultStr = "";  
        if(!StringUtils.isBlank(say())){  
            resultStr = say() + ", is not blank.";  
        }  
        return resultStr;  
    }  
  
}

然后,在webapp目錄下,創(chuàng)建一個jsp文件indexJavaStringUtils.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  
<%@page import="com.lfqy.util.*" %>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Hello World!</title>  
</head>  
<%  
    String tmpStr = HelloStringUtils.sayStringUtils();  
%>  
<body>  
    <h2>indexJavaStringUtils.jsp: <%=tmpStr%></h2>  
</body>  
</html>

這時候,重啟服務器,然后瀏覽器訪問http://localhost:8080/indexJavaStringUtils.jsp,會直接報錯。

# HTTP Status 500 – Internal Server Error

---

**Type** Exception Report

**Message** An exception occurred processing JSP page /indexJavaStringUtils.jsp at line 9

**Description** The server encountered an unexpected condition that prevented it from fulfilling the request.

**Exception**

org.apache.jasper.JasperException: An exception occurred processing JSP page /indexJavaStringUtils.jsp at line 9

6:     <title>Hello World!</title>
7: </head>
8: <%
9:     String tmpStr = HelloStringUtils.sayStringUtils();
10: %>
11: <body>
12:     <h2>indexJavaStringUtils.jsp: <%=tmpStr%></h2>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:579)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:461)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

**Root Cause**

javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
    org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:139)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

**Root Cause**

java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
    com.lfqy.util.HelloStringUtils.sayStringUtils(HelloStringUtils.java:14)
    org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:119)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

**Root Cause**

java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1352)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
    com.lfqy.util.HelloStringUtils.sayStringUtils(HelloStringUtils.java:14)
    org.apache.jsp.indexJavaStringUtils_jsp._jspService(indexJavaStringUtils_jsp.java:119)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

**Note** The full stack trace of the root cause is available in the server logs.

---

### Apache Tomcat/8.0.53

如下截圖。


image.png

為了解決這個問題,首先在目錄webapp/WEB-INF下新建兩個目錄classeslib,新建完成之后的目錄結構如下。

image.png

然后,設置下當前module的編譯輸出目錄。點擊File->Project Structure...,在彈出的對話框中,點擊Modules,然后,選中剛剛新建的mvn-tmct這個模塊,點擊Paths標簽頁,設置Output path/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/classes,Test output path不用管。如下圖。

image.png

點擊OK完成。
接下來,還需要在當前模塊的根目錄,也就是pom.xml文件所在的目錄執(zhí)行如下命令,將該module的maven依賴的jar包拷貝到前面新建的lib目錄:

$ ls

mvn-tmct.iml pom.xml src target

$ mvn dependency:copy-dependencies -DoutputDirectory=/Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/lib -DincludeScope=runtime

[INFO] Scanning for projects...

[INFO] 

[INFO] -----------------------< com.lfqy.j2ee:mvn-tmct >-----------------------

[INFO] Building mvn-tmct 1.0-SNAPSHOT

[INFO] --------------------------------[ jar ]---------------------------------

[INFO] 

[INFO] --- maven-dependency-plugin:2.8:copy-dependencies (default-cli) @ mvn-tmct ---

[INFO] Copying commons-lang-2.6.jar to /Users/chengxia/Developer/TrialProject/mvn-tmct/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  1.669 s

[INFO] Finished at: 2022-11-23T21:45:02+08:00

[INFO] ------------------------------------------------------------------------
$

到這里,重啟服務,會發(fā)現(xiàn)編譯的輸出到了剛新建的classes目錄下,lib目錄下也有了maven依賴的jar包。如下。


image.png

這時候瀏覽器中訪問http://localhost:8080/indexJavaStringUtils.jsp,發(fā)現(xiàn)已經(jīng)正常了。如下:

image.png

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容