Vscode 配置java_web 的一些問題


前置條件,安裝JDK,VScode(其中依賴插件:Extension Pack for Java,Language Support for Java(TM) by Red Hat,Maven for JavaTomcat for Java),Maven,


1.1在vscode上配置Tomcat

1)先安裝:官方網站(最好使用9.0的版本,因為10.0的版本中的一些名字會發生改變)

2)安裝Tomcat for Java插件:然后點擊插件中右上角的 + 號

image-20210908145342241

然后選擇你本地安裝Tomcat的目錄:image-20210908145535503

完成之后:image-20210908145613334


2創建java_web項目:

2.1 在vscode中按快捷鍵:ctrl + shift + p 然后輸入 maven,之后在選擇如下圖中所示:

image-20210908150144839

2.2 選擇webapp:

image-20210908150319511

2.3 版本可以隨便選,這里以1.4為例

image-20210908150504570

2.4 輸入項目路徑及名稱,這里可以隨意

image-20210908150641179

image-20210908150657188

2.5選擇文件夾存放項目

image-20210908150734822

2.6 maven 開始部署相關配置

2.6.1 當詢問你選擇version時,直接回車即可image-20210908151106022

2.6.2 當詢問你選擇package時,直接回車即可

image-20210908151202515

2.6.3 當出現 如下提示就表明項目建立好了:image-20210908151258044

2.7 然后建立所需要的目錄:java,test,resources,其文件結構圖如下所示:

image-20210908151658483

其中java文件夾用來存放java文件, resources用來存放資源文件(maven編譯時會識別文件夾名所以必須要叫resources, 不然就要在pom.xml中手動配置資源文件夾)到此一個web項目的框架已經建好了, 使用maven創建web項目的話導包都是在pom.xml中進行


3 運行java_web程序

3.1 按下ctrl+shift+p, 輸入maven,懸着執行命令

image-20210908151954062

3.2 然后選擇你剛剛創建的項目,我這邊是mercurows

image-20210908152054422

3.3 然后選擇package

image-20210908152129024

maven對項目編譯完成之后終端顯示如下:

image-20210908152220654

其中還會生產target目錄

3.4 在Tomcat上運行項目

​ 項目左邊文件導航中:項目文件->target->項目名稱.war

​ 右鍵選擇用tomcat運行:

image-20210908152647487

3.5 如果終端沒有報錯的話,就可以展開TOMCAT SERVERS插件 使用瀏覽器打開項目

image-20210908152843766

​ **其打開的是 webapp中的index.jsp中的文件 ****

image-20210908153030487

4.1 maven 的一些功能

4.1.1 可使用項目其中的clean功能,清理target目錄

image-20210908153426918

然后項目中的target目錄就會消失。

附加:導入jar包方法:(這里以 servlet.jar包 為樣例說明)

0.1 先來看看如果沒有導入JDK1.7沒有自帶的servlet包會出現什么情況:

image-20210908154842065

法一:不依賴於maven包管理的手動配置包(最下文有更新方法~)

1.1 在項目目錄文件下建立lib文件夾 然后在其中放入需要導入的包(servlet-api)

image-20210908154236635

*注:擔心兼容問題,這里用的servlet包是Tomcat lib中的 servlet-api

image-20210908155403673

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文件夾用來存放源碼

image-20210908161042150

綜上,我的。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

  • 導入成功:

    image-20210908161533304

  • 但是實際上我這雖然識別出了包,但是打包項目時失敗了,文末有類似問題的解決方法。

    image-20210908161819295

法二:借助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類:

image-20210908162854482

image-20210908162913626


附件:

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>

  • 項目文件結構:

    image-20210908163553496

    2021-11-3 更新 法一:不依賴於maven包管理的手動配置包

    在上文提到了,用.classpath文件手動導入包之后可以在本地運行,但是打包到tomcat后就無法正常運行,

    現在給出解決方法,這里以數據庫連接為例子(即手動導入mysql-connector-java版本為8.0.27)。(同理這里也就只需要將mysql連接jar包放入lib目錄中,以及在.classpath 文件中新添一條命令(在下圖))

    1.1)先不使用maven包管理,直接使用 (法一) 的方法,進行測試(本地連接):

    其中pom.xml中沒有依賴mysql-connector-java

image-20211103115625331

本地構建項目完后本倉庫也沒有下載 mysql-connector-java 因此,這里依靠的只有lib里面的

image-20211103115932034

文件框架:

.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)執行相關的訪問數據庫指令,其執行結果如下,可以看出可以正常訪問遠程數據庫:

image-20211103121713438

1.3)打包項目,放到tomcat中運行:

然后提示這個錯誤:

image-20211103123402165

再看看tomcat里面是作怎么說的:

image-20211103123448243

很明顯說明這數據庫連接包沒有正常導入。

2.1)尋找問題:

在打算將打包的放在tomcat服務器上運行的 *.war打開來看看之前,先來了解一下里面的相關的文件及其作用


引用於:WEB-INF目錄與META-INF目錄詳解

  • 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包,也就是說上傳至服務端時完全沒用到。

image-20211103165957852

2.2)嘗試解決問題:

在上面我們還發現一個問題,就是對照與上面附錄中的項目結構,發現還少了一個.classpath 文件。

image-20211103170517482

因此,我們就順手將項目中的.classpath文件也丟一份進,再然后為了能順利的將我們需要的數據庫連接jar包打包到tomcat服務器中,這里需要我們手動的復制一份lib(里面包含所需的*.jar文件)。如下圖:

image-20211103171335227

再次打包項目,之后就會發現對應的lib文件里面有我們想要的數據庫連接jar了:

image-20211103173846710

然后就可以正常訪問到服務器了:

image-20211103173241718


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM