Maven classpath


運行一條mvn clean package命令,Maven會幫你清除target目錄,重新建一個空的,編譯src/main/java類至target/classes,復制src/main/resources的文件至target/classes,編譯src/test/java至target/test-classes,復制src/test/resources的文件至target/test-classes;然后運行所有測試;測試通過后,使用jar命令打包,存儲於target目錄。Maven做的事情一點也不少,只是都對用戶隱蔽起來了,它只要求你遵循它的約定。

maven項目的classpath在  target/classes/ , 假設資源文件放在maven工程的 src/main/resources 資源文件夾下,源碼文件放在 src/main/java/下, 那么java文件夾和resources文件夾在運行時就是classpath的真實位置( target/classes/ ), 所以 java和resources目錄下的文件都可以當成在classpath下面

如果有一個文件位於 src/main/resources/test.txt, 有一個類位於 src/main/java/com/MyClass.java

FILE_NAME = "test.txt"

通過如下代碼

MyClass.class.getClassLoder().getResource(FILE_NAME).getPath();

可以直接獲取文件路徑

而classpath可以通過如下代碼獲取

MyClass.class.getClassLoder().getResource("").getPath();

 

還有一種方法可以通過當前類的加載路徑使用相對路徑來獲取資源地址

MyClass.class.getResource(FILE_NAME).getPath()

 

二、Java虛擬機(JVM)尋找Class的順序

2.1 Bootstrap classes

屬於Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心級別的class.這是由JVM Bootstrap class loader來載入的.一般是放置在{java_home}\jre\lib目錄下

2.2 Extension classes

基於Java擴展機制,用來擴展Java核心功能模塊.比如Java串口通訊模塊comm.jar.一般放置在{Java_home}\jre\lib\ext目錄下

2.3 User classes

開發人員或其他第三方開發的Java程序包.通過命令行的-classpath或-cp,或者通過設置CLASSPATH環境變量來引用.JVM通過放置在{java_home}\lib\tools.jar 來尋找和調用用戶級的class.常用的javac也是通過調用tools.jar來尋找用戶制定的編譯Java源程序.這樣就引出了User class路徑搜索的順序或優先級別的問題.

2.3.1 缺省值:調用Java或javawa的當前路徑(.),是開發的class所存在的當前目錄

2.3.2 CLASSPATH環境變量設置的路徑.如果設置了CLASSPATH,則CLASSPATH的值會覆蓋缺省值

2.3.3 執行Java的命令行-classpath或-cp的值,如果制定了這兩個命令行參數之一,它的值會覆蓋環境變量CLASSPATH的值

2.3.4 -jar 選項:如果通過java –jar 來運行一個可執行的jar包,這當前jar包會覆蓋上面所有的值.換句話說,-jar 后面所跟的jar包的優先級別最高,如果指定了-jar選項,所有環境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會以jar包為搜索范圍.有關可執行jar有許多相關的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來全面了解.

這也是為什么應用程序打包成可執行的jar包后,不能引用第三方jar包的原因.

三、解決方案.

首先我們簡要歸納一下,為了方便理解,簡化一下上面描述的架構,

Java定義了三種級別的class,分別為BootStrap class,Extend Class,User class.

其中User class限制規則最復雜.在User class中可執行的jar包,更包含獨立安全規則.所以解決方案基於Java三種不同級別的class擴展機制,有三種不同的方案.

3.1 BootStrap class擴展方案

Java 命令行提供了如何擴展bootStrap 級別class的簡單方法.

-Xbootclasspath:基本核心的Java class 搜索路徑.不常用,否則要重新寫所有Java 核心class

-Xbootclasspath/a: 后綴在核心class搜索路徑后面.常用.

-Xbootclasspath/p:前綴在核心class搜索路徑前面.不常用,避免引起不必要的沖突.

語法如下:

java –Xbootclasspath/a:/path/myclass/account.jar: -jar yourself.jar(Unix用:號隔開)

java –Xbootclasspath:/d:/myclass/account.jar; -jar yourself.jar(Window用;號隔開)

3.2 extend class 擴展方案

Java exten class 存放在{Java_home}\jre\lib\ext 目錄下.當調用Java時,對擴展class路徑的搜索是自動的.總會搜索的.這樣,解決的方案就很簡單了,將所有要使用的第三方的jar包都復制到ext 目錄下.

3.3 User class擴展方案

當使用-jar執行可執行Jar包時,JVM將Jar包所在目錄設置為codebase目錄,所有的class搜索都在這個目錄下開始.所以如果使用了其他第三方的jar包,一個比較可以接受的可配置方案,就是利用jar包的Manifest擴展機制.步驟如下

1.將需要的第三方的jar包,復制在同可執行jar所在的目錄或某個子目錄下.

比如:jar 包在 d:\crm\luncher.jar 那么你可以把所有jar包復制到d:\crm目錄下或d:\crm\lib 子目錄下.

2.修改Manifest 文件

在Manifest.mf文件里加入如下行

Class-Path:classes12.jar lib/class12.jar

Class-Path 是可執行jar包運行依賴的關鍵詞.詳細內容可以參考http://java.sun.com/docs/books/tutorial/ext/index.html

3.4 User class擴展方案二

直接使用命令行模式來指定classpath以及要運行的main方法

windows:
java -cp "Test.jar;lib/*" my.package.MainClass

Under Linux:
java -cp "Test.jar:lib/*" my.package.MainClass


免責聲明!

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



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