前置條件,安裝JDK,VScode(其中依賴插件:Extension Pack for Java,Language Support for Java(TM) by Red Hat,Maven for Java
,Tomcat for Java
),Maven,
1.1在vscode上配置Tomcat
1)先安裝:官方網站(最好使用9.0的版本,因為10.0的版本中的一些名字會發生改變)
2)安裝Tomcat for Java
插件:然后點擊插件中右上角的 + 號
然后選擇你本地安裝Tomcat的目錄:
完成之后:
2創建java_web項目:
2.1 在vscode中按快捷鍵:ctrl + shift + p 然后輸入 maven,之后在選擇如下圖中所示:
2.2 選擇webapp:
2.3 版本可以隨便選,這里以1.4為例
2.4 輸入項目路徑及名稱,這里可以隨意
2.5選擇文件夾存放項目
2.6 maven 開始部署相關配置
2.6.1 當詢問你選擇version時,直接回車即可
2.6.2 當詢問你選擇package時,直接回車即可
2.6.3 當出現 如下提示就表明項目建立好了:
2.7 然后建立所需要的目錄:java,test,resources,其文件結構圖如下所示:
其中java文件夾用來存放java文件, resources用來存放資源文件(maven編譯時會識別文件夾名所以必須要叫resources, 不然就要在pom.xml中手動配置資源文件夾)到此一個web項目的框架已經建好了, 使用maven創建web項目的話導包都是在pom.xml中進行
3 運行java_web程序
3.1 按下ctrl+shift+p, 輸入maven,懸着執行命令
3.2 然后選擇你剛剛創建的項目,我這邊是mercurows
3.3 然后選擇package
maven對項目編譯完成之后終端顯示如下:
其中還會生產target目錄
3.4 在Tomcat上運行項目
項目左邊文件導航中:項目文件->target->項目名稱.war
右鍵選擇用tomcat運行:
3.5 如果終端沒有報錯的話,就可以展開TOMCAT SERVERS插件 使用瀏覽器打開項目
**其打開的是 webapp中的index.jsp中的文件 ****
4.1 maven 的一些功能
4.1.1 可使用項目其中的clean功能,清理target目錄
然后項目中的target目錄就會消失。
附加:導入jar包方法:(這里以 servlet.jar包 為樣例說明)
0.1 先來看看如果沒有導入JDK1.7沒有自帶的servlet
包會出現什么情況:
法一:不依賴於maven包管理的手動配置包(最下文有更新方法~)
1.1 在項目目錄文件下建立lib
文件夾 然后在其中放入需要導入的包(servlet-api)
*注:擔心兼容問題,這里用的servlet
包是Tomcat lib
中的 servlet-api
包
1.2在資源管理中找到項目根目錄下的.classpath
文件,然后用vscode打開
目的:只需將 jar 的路徑填入到 path 中即可,源碼路徑填入到 sourcepath 中即可(暫時不清楚源碼哪里看= =、、)
然后, 增加一行 classpathentry,並填入正確的路徑,可以填相對路徑,也可以填絕對路徑
<!--多出的一行-->
<classpathentry kind="lib" path="lib/servlet-api.jar" sourcepath="lib/sources/文件名"/>
由於我不清楚源碼哪里看,所以上面代碼可以將``sourcepath`給刪除了,變成以下代碼:
<!--多出的一行-->
<classpathentry kind="lib" path="lib/servlet-api.jar"/>
注:如果需要填寫sourcepath
的話,需要在lib下建立一個sourcepath
文件夾用來存放源碼:
綜上,我的。classpath
文件配置為:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
<!--多出的一行-->
<classpathentry kind="lib" path="lib/servlet-api.jar"/>
</classpath>
1.3 重啟vscode
-
導入成功:
-
但是實際上我這雖然識別出了包,但是打包項目時失敗了,文末有類似問題的解決方法。
法二:借助maven的包管理
[這里推薦一個Maven包管理的網站https://mvnrepository.com/;->search你需要尋找的包->點擊其中的一個搜索結果(可能不唯一,你得一個一個試,不過一般來說下載量最多那個就是了)->選擇下欄的Maven
的代碼(其格式類似於下面的那個) ]
1.1 打開項目中的pom.xml
配置文件,然后在 <dependencies>
與 </dependencies>
代碼中添加以下代碼:
<!-- 程序包javax.servlet.http -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
綜上,我的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>com.test</groupId>
<artifactId>mercurows</artifactId>
<version>1</version>
<packaging>war</packaging>
<name>mercurows Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<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>
<!-- 程序包javax.servlet.http -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>mercurows</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</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>
- 法二可以正常的打包運行項目,初始化Servlet類:
附件:
web.xml
配置代碼:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 第一個 !-->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>servlet.demo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
-
項目文件結構:
2021-11-3 更新 法一:不依賴於maven包管理的手動配置包
在上文提到了,用.classpath文件手動導入包之后可以在本地運行,但是打包到tomcat后就無法正常運行,
現在給出解決方法,這里以數據庫連接為例子(即手動導入
mysql-connector-java
版本為8.0.27)。(同理這里也就只需要將mysql連接jar包放入lib目錄中,以及在.classpath
文件中新添一條命令(在下圖))1.1)先不使用maven包管理,直接使用 (法一) 的方法,進行測試(本地連接):
其中pom.xml中沒有依賴mysql-connector-java 包
本地構建項目完后本倉庫也沒有下載 mysql-connector-java 因此,這里依靠的只有lib里面的
文件框架:
在.classpath
中新增的指令:
<classpathentry kind="lib" path="lib/mysql-connector-java-8.0.27.jar" sourcepath="lib/sources/mysql-connector-java-8.0.27.7z"/>
1.2)執行相關的訪問數據庫指令,其執行結果如下,可以看出可以正常訪問遠程數據庫:
1.3)打包項目,放到tomcat中運行:
然后提示這個錯誤:
再看看tomcat里面是作怎么說的:
很明顯說明這數據庫連接包沒有正常導入。
2.1)尋找問題:
在打算將打包的放在tomcat服務器上運行的 *.war
打開來看看之前,先來了解一下里面的相關的文件及其作用
-
WEB-INF簡介
WEB-INF是Java的WEB應用的安全目錄。所謂安全就是客戶端無法訪問,只有服務端可以訪問的目錄。
如果想在頁面中直接訪問其中的文件,必須通過 web.xml 文件對要訪問的文件進行相應映射才能訪問。
-
WEB-INF目錄的作用
/WEB-INF/web.xml
Web應用程序配置文件,描述了 servlet 和其他的應用組件配置及命名規則。
/WEB-INF/classes/
包含了站點所有用的 class 文件,包括 servlet class 和非servlet class,他們不能包含在 .jar文件中。
/WEB-INF/lib/
存放web應用需要的各種JAR文件,放置僅在這個應用中要求使用的jar文件,如數據庫驅動jar文件。
/WEB-INF/src/
源碼目錄,按照包名結構放置各個Java文件。
/WEB-INF/database.properties
數據庫配置文件
/WEB-INF/tags/
存放了自定義標簽文件,該目錄並不一定為 tags,可以根據自己的喜好和習慣為自己的標簽文件庫命名,當使用自定義的標簽文件庫名稱時,在使用標簽文件時就必須聲明正確的標簽文件庫路徑。例如:當自定義標簽文件庫名稱為 simpleTags 時,在使用 simpleTags 目錄下的標簽文件時,就必須在 jsp 文件頭聲明為:<%@ taglibprefix="tags" tagdir="/WEB-INF /simpleTags" % >。
/WEB-INF/jsp/
jsp 1.2 以下版本的文件存放位置。改目錄沒有特定的聲明,同樣,可以根據自己的喜好與習慣來命名。
WEB-INF/jsp2/
與 jsp 文件目錄相比,該目錄下主要存放 Jsp 2.0 以下版本的文件,當然,它也是可以任意命名的,同樣為區別 Jsp 1.2以下版本的文件目錄,通常才命名為 jsp2。
META-INF
相當於一個信息包,目錄中的文件和目錄獲得Java 2平台的認可與解釋,用來配置應用程序、擴展程序、類加載器和服務manifest.mf文件,在用jar打包時自動生成。
對照與上面的所介紹的,我們應去找*.war目錄下的/WEB-INF/lib/
文件夾。然后我發現里面並沒有 mysql-connector-java jar包,也就是說上傳至服務端時完全沒用到。
2.2)嘗試解決問題:
在上面我們還發現一個問題,就是對照與上面附錄中的項目結構,發現還少了一個.classpath
文件。
因此,我們就順手將項目中的.classpath
文件也丟一份進,再然后為了能順利的將我們需要的數據庫連接jar包打包到tomcat服務器中,這里需要我們手動的復制一份lib(里面包含所需的*.jar
文件)。如下圖:
再次打包項目,之后就會發現對應的lib文件里面有我們想要的數據庫連接jar了:
然后就可以正常訪問到服務器了: