一 war永遠依賴于jar
從來只有war包中含有jar包,而沒有jar包中含有war包
web工程依賴的java工程,就是jar包,這個jar包經(jīng)過自動化部署后,會放在web工程的web-inf/lib目錄下
1. 在web工程的項目2中,加入項目1的路徑依賴
在 pro02-maven-web 工程的 pom.xml 中,找到 dependencies 標簽,在 dependencies 標簽中做如下配置
<dependency>
<!--
通過指定被依賴工程的坐標完成依賴
-->
<groupId>com.xyt.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compiler</scope>
</dependency>
2 在web工程中,加入測試代碼
證明在Web工程中可以使用Java工程中創(chuàng)建的那個類:Calculator
2.1 創(chuàng)建目錄
mkdir src\test\java\com\xyt\maven
2.2 確認依賴junit
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2.3創(chuàng)建測試類
2.4 運行測試
mvn test
2.5 打包
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
確實生成了一個jar包
2.6 查看依賴列表
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn dependency:list
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] The following files have been resolved:
[INFO] junit:junit:jar:4.11:test
[INFO] com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] javax.servlet:javax.servlet-api:jar:3.1.0:provided
2.7 樹形結(jié)構(gòu)查看
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency:2.8:tree (default-cli) @ pro02-maven-web ---
[WARNING] Parameter 'localRepository' is deprecated core expression; Avoid use of ArtifactRepository type. If you need access to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO] com.xyt.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] ------------------------------------------------------------------------
二 測試依賴的范圍
一個depency里面有四個元素
<dependency>
<!--
通過指定被依賴工程的坐標完成依賴
-->
<groupId>com.xyt.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
scope代表作用范圍,標簽的作用范圍
scope提供這么多依賴的原因就是,把它測試用的test,本地提供的provided,和常規(guī)complie區(qū)分開來
compile/test/provided/system/runtime/import
開發(fā)過程有效的含義就是,在IDEA中寫項目時候,我們能不能把它點出來
部署到服務(wù)器有效的含義是,把war包丟到tomcat里面時,是否包含對應(yīng)文件
將這個文件里面導(dǎo)入
1 compile的編譯過程
1.1 compile編譯Calulator
在 HelloServlet 類中導(dǎo)入 Calculator 類,然后編譯就說明有效。
D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\java\xyt\maven\HelloServlet.java
引入一個測試文件
/**
* 通過import語句將要測試的類引入當前類
引入后,編譯通過,可以使用,這個范圍的依賴對當前類有效
引入后,編譯失敗,不可以使用,這個范圍的依賴對當前類無效
*main目錄下的java類:HelloServlet
*complie范圍引入的·依賴:pro01-maven-java
*pro01-maven-java中的類:Calculator
*驗證的目標:
*
*
*
*
*/
import com.xyt.maven.Calculator;
public class HelloServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello maven web");
}
}
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.1.0:clean (default-clean) @ pro02-maven-web ---
[INFO] Deleting D:\maven_workspace\spaceVideo\pro02-maven-web\target
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
[INFO]
[INFO] --- compiler:3.8.0:compile (default-compile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
D:\maven_workspace\spaceVideo\pro02-maven-web\pom.xml
<dependency>
<!--
通過指定被依賴工程的坐標完成依賴
-->
<groupId>com.xyt.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
1.2 編譯CalculatorTest
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn clean test-compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.1.0:clean (default-clean) @ pro02-maven-web ---
[INFO] Deleting D:\maven_workspace\spaceVideo\pro02-maven-web\target
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
[INFO]
[INFO] --- compiler:3.8.0:compile (default-compile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\classes
[INFO]
[INFO] --- resources:3.0.2:testResources (default-testResources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\test\resources
[INFO]
[INFO] --- compiler:3.8.0:testCompile (default-testCompile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\test-classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
-
通過import語句將要測試的類引入當前類
引入后,編譯通過,可以使用,這個范圍的依賴對當前類有效
引入后,編譯失敗,不可以使用,這個范圍的依賴對當前類無效 -
main目錄下的java類:HelloServlet
-
complie范圍引入的·依賴:pro01-maven-java
-
pro01-maven-java中的類:Calculator
1.3 打包成war包
主體功能放在這個compile里面99%
打war包:
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.1.0:clean (default-clean) @ pro02-maven-web ---
[INFO] Deleting D:\maven_workspace\spaceVideo\pro02-maven-web\target
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
[INFO]
[INFO] --- compiler:3.8.0:compile (default-compile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
2 test的編譯過程
2.1 main空間里面編譯信息
在HttpSevelet里面導(dǎo)入信息
import org.junit.Test;
編譯失?。候炞Cmain空間下編譯這個Test依賴,會出問題
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn clean compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.1.0:clean (default-clean) @ pro02-maven-web ---
[INFO] Deleting D:\maven_workspace\spaceVideo\pro02-maven-web\target
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
[INFO]
[INFO] --- compiler:3.8.0:compile (default-compile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /D:/maven_workspace/spaceVideo/pro02-maven-web/src/main/java/xyt/maven/HelloServlet.java:[25,17] 程序包org.junit不存在
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.318 s
[INFO] Finished at: 2023-05-04T23:43:22+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project
pro02-maven-web: Compilation failure
[ERROR] /D:/maven_workspace/spaceVideo/pro02-maven-web/src/main/java/xyt/maven/HelloServlet.java:[25,17] 程序包org.junit不存在
在pro01-maven-java\src\main\java\com\xyt\maven目錄下修改Calculator.java
2.2 test空間下編譯
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
沒問題,test必然可以在test下編譯,本身test就是為test服務(wù)的
在HttpSevelet里面注釋信息
//import org.junit.Test;
```bash
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn clean test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.1.0:clean (default-clean) @ pro02-maven-web ---
[INFO] Deleting D:\maven_workspace\spaceVideo\pro02-maven-web\target
[INFO]
[INFO] --- resources:3.0.2:resources (default-resources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\main\resources
[INFO]
[INFO] --- compiler:3.8.0:compile (default-compile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\classes
[INFO]
[INFO] --- resources:3.0.2:testResources (default-testResources) @ pro02-maven-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\maven_workspace\spaceVideo\pro02-maven-web\src\test\resources
[INFO]
[INFO] --- compiler:3.8.0:testCompile (default-testCompile) @ pro02-maven-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\maven_workspace\spaceVideo\pro02-maven-web\target\test-classes
[INFO]
[INFO] --- surefire:2.22.1:test (default-test) @ pro02-maven-web ---
[WARNING] Parameter 'localRepository' is deprecated core expression; Avoid use of ArtifactRepository type. If you need access to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.xyt.maven.CalculatorTest
輸出測試的程序代碼
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.03 s - in com.xyt.maven.CalculatorTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
3 provided的編譯過程
3.1 test和provided不參與部署到服務(wù)器
- compile范圍依賴的jar包會放入war包,通過test范圍依賴的jar包不會放入war包。
- 所有東西都發(fā)給服務(wù)器,會增加服務(wù)器的負擔
- 編譯程序類似于火箭發(fā)射,junit類似于腳手架,不會交房交個腳手架
3.2 provided已經(jīng)提供的意思
說明Tomcat里面有這個依賴,如果非要提供,會造成依賴沖突的問題
比方說jsp-api沒有注明provided帶進war包部署,會造成視圖顯示錯誤,造成空指針異常
NULLPOINTEREXCEPTION,
三 測試依賴的總結(jié)
1 compile:
使用第三方框架的jar包,或者項目真正需要部署的功能依賴,都用這個scope修飾
詳細解釋:
1)編譯依賴范圍(compile),該范圍就是默認依賴范圍,此依賴范圍對 于編譯、測試、運行三種classpath都有效,舉個簡單的例子,假如項目中有spring-core的依賴,那么spring-core不管是在編譯,測試,還是運行都會被用到,因此spring-core必須是編譯范圍(構(gòu)件默認的是編譯范圍,所以依賴范圍是編譯范圍的無須顯示指定)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
<scope>compile</scope> <!--默認為該依賴范圍,無須顯示指定--〉
</dependency>
2 test
測試過程中使用的jar包,以test范圍寫進來,比如junit
詳細解釋
顧名思義就是針對于測試的,使用此依賴范圍的依賴,只對測試classpath有效,在編譯主代碼和項目運行時,都將無法使用該依賴,最典型的例子就是 Junit, 構(gòu)件在測試時才需要,所以它的依賴范圍是測試,因此它的依賴范圍需要顯示指定為test ,當然不顯示指定依賴范圍也不會報錯,但是該依賴會被加入到編譯和運行的classpath中,造成不必要的浪費 。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
3 provided
主要是為了減輕服務(wù)器的負擔,避免依賴沖突,比方說本地項目中有jsp-api.jar,但是tomcat里面也有這個文件,如果硬要導(dǎo)入,就會產(chǎn)生沖突,報空指針異常文章來源:http://www.zghlxwxcb.cn/news/detail-434316.html
典型的例子就是servlet-api, 編譯和測試該項目的時候需要該依賴,但是在運行時,web容器已經(jīng)提供的該依賴,所以運行時就不再需要此依賴,如果不顯示指定該依賴范圍,并且容器依賴的版本和maven依賴的版本不一致的話,可能會引起版本沖突,造成不良影響
。文章來源地址http://www.zghlxwxcb.cn/news/detail-434316.html
到了這里,關(guān)于maven從入門到精通 第三章 Maven中形成web對Java工程的依賴的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!