日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java -jar 启动程序/设置classpath

發布時間:2024/9/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java -jar 启动程序/设置classpath 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 前言
  • java 類加載器與路徑
  • java 設置路徑的方法
    • 設置 bootclasspath
    • 設置 Extensions JAR files
    • 設置 classpath
  • 測試程序
  • java -jar 啟動時,`-cp`參數無效
  • jar 文件的 Class-Path
  • java -jar 啟動程序時,設置classpath的方法
    • 方法1:修改 bootclasspath
    • 方法2:修改 Extensions JAR files
    • 方法3:修改classpath
      • springboot項目怎么做?
      • maven項目打包時,由maven生成`META-INF\MANIFEST.MF`文件且設置`Class-Path`
      • 無法重新打包時,修改`META-INF\MANIFEST.MF`文件且設置`Class-Path`
  • 擴展知識(轉)

前言

  • jdk 1.8
  • 期望在java -jar命令執行java程序時,能夠指定classpath

java 類加載器與路徑

java 類加載器有三個:

  • Bootstrap CLassLoader
  • ExtClassLoader
  • AppClassLoader

java 類加載器對應的路徑:

  • bootclasspath:對應 Bootstrap CLassLoader。java虛擬機系統參數sun.boot.class.path。
  • Extensions JAR files:對應 Extention ClassLoader 。java虛擬機系統參數java.ext.dirs。
  • classpath:對應 AppClassLoader。java虛擬機系統參數java.class.path。

java 設置路徑的方法

設置 bootclasspath

參考這里

設置 Extensions JAR files

參考這里

設置 classpath

參考這里

測試程序

創建maven項目PrintPath,代碼如下:

import java.io.File;public class Test {public static void main(String[] args) {printPath("java.home");printPath("sun.boot.class.path");printPath("java.ext.dirs");printPath("java.class.path");}public static void printPath(String name) {System.out.println(name + ":");String[] paths = System.getProperty(name).split(File.pathSeparator);for(String path : paths) {System.out.println("- " + path);}} }

運行結果

cmd> java -jar target\PrintPath.jar java.home: - C:\Program Files\Java\jre1.8.0_144 sun.boot.class.path: - C:\Program Files\Java\jre1.8.0_144\lib\resources.jar - C:\Program Files\Java\jre1.8.0_144\lib\rt.jar - C:\Program Files\Java\jre1.8.0_144\lib\sunrsasign.jar - C:\Program Files\Java\jre1.8.0_144\lib\jsse.jar - C:\Program Files\Java\jre1.8.0_144\lib\jce.jar - C:\Program Files\Java\jre1.8.0_144\lib\charsets.jar - C:\Program Files\Java\jre1.8.0_144\lib\jfr.jar - C:\Program Files\Java\jre1.8.0_144\classes java.ext.dirs: - C:\Program Files\Java\jre1.8.0_144\lib\ext - C:\WINDOWS\Sun\Java\lib\ext java.class.path: - target\PrintPath.jar

java -jar 啟動時,-cp參數無效

使用-jar選項(形如:java -jar xxx.jar )來運行一個可執行的jar包時,-jar會覆-cp的值。

cmd> java -cp D:\java_ext\sunec.jar -jar target\PrintPath.jar java.home: - C:\Program Files\Java\jre1.8.0_144 sun.boot.class.path: - C:\Program Files\Java\jre1.8.0_144\lib\resources.jar - C:\Program Files\Java\jre1.8.0_144\lib\rt.jar - C:\Program Files\Java\jre1.8.0_144\lib\sunrsasign.jar - C:\Program Files\Java\jre1.8.0_144\lib\jsse.jar - C:\Program Files\Java\jre1.8.0_144\lib\jce.jar - C:\Program Files\Java\jre1.8.0_144\lib\charsets.jar - C:\Program Files\Java\jre1.8.0_144\lib\jfr.jar - C:\Program Files\Java\jre1.8.0_144\classes java.ext.dirs: - C:\Program Files\Java\jre1.8.0_144\lib\ext - C:\WINDOWS\Sun\Java\lib\ext java.class.path: - target\PrintPath.jar
  • -cp參數無效

jar 文件的 Class-Path

在jar中存在一個名為META-INF\MANIFEST.MF的文件,該文件中有個名為Class-Path的屬性。Class-Path的屬性中的jar會被加載。

java -jar 啟動程序時,設置classpath的方法

方法1:修改 bootclasspath

此種方法可以添加少量的jar文件。當jar文件很多時,應該也可以。

cmd> java -Xbootclasspath/a:.\lib2\xx1.jar;.\lib2\xx2.jar -jar target\PrintPath.jar java.home: - C:\Program Files\Java\jre1.8.0_144 sun.boot.class.path: - C:\Program Files\Java\jre1.8.0_144\lib\resources.jar - C:\Program Files\Java\jre1.8.0_144\lib\rt.jar - C:\Program Files\Java\jre1.8.0_144\lib\sunrsasign.jar - C:\Program Files\Java\jre1.8.0_144\lib\jsse.jar - C:\Program Files\Java\jre1.8.0_144\lib\jce.jar - C:\Program Files\Java\jre1.8.0_144\lib\charsets.jar - C:\Program Files\Java\jre1.8.0_144\lib\jfr.jar - C:\Program Files\Java\jre1.8.0_144\classes - .\lib2\xx1.jar - .\lib2\xx2.jar java.ext.dirs: - C:\Program Files\Java\jre1.8.0_144\lib\ext - C:\WINDOWS\Sun\Java\lib\ext java.class.path: - target\PrintPath.jar

方法2:修改 Extensions JAR files

此種方法可以添加jar所在的目錄。當jar文件很多時,比較友好。但是,需要注意:盡量將java自帶的lib\ext目錄帶上。

cmd> java -Djava.ext.dirs="%JAVA_HOME%jre\lib\ext;.\lib" -jar target\PrintPath.jar java.home: - C:\Program Files\Java\jre1.8.0_144 sun.boot.class.path: - C:\Program Files\Java\jre1.8.0_144\lib\resources.jar - C:\Program Files\Java\jre1.8.0_144\lib\rt.jar - C:\Program Files\Java\jre1.8.0_144\lib\sunrsasign.jar - C:\Program Files\Java\jre1.8.0_144\lib\jsse.jar - C:\Program Files\Java\jre1.8.0_144\lib\jce.jar - C:\Program Files\Java\jre1.8.0_144\lib\charsets.jar - C:\Program Files\Java\jre1.8.0_144\lib\jfr.jar - C:\Program Files\Java\jre1.8.0_144\classes java.ext.dirs: - C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext - .\lib2 java.class.path: - target\PrintPath.jar

方法3:修改classpath

java -jar方式啟動程序時,-cp參數是無效的,則不能通過-cp參數設置classpath。其替代方法是,在JAR中的META-INF\MANIFEST.MF文件里設置Class-Path。

推薦此法:在JAR中的META-INF\MANIFEST.MF文件里設置Class-Path。

springboot項目怎么做?

springboot項目時不需要處理。確實需要處理時,參考這里。

PS:確保springboot項目的POM.xml中包含了spring-boot-maven-plugin插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

maven項目打包時,由maven生成META-INF\MANIFEST.MF文件且設置Class-Path

修改POM.xml

<?xml version="1.0" encoding="UTF-8"?> <project ...>...<build><finalName>${project.artifactId}</finalName><plugins><!-- 生成manifest,假定依賴的jar都在與本程序同目錄的lib目錄下 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib</classpathPrefix><mainClass>test.Test</mainClass></manifest></archive></configuration></plugin><!-- 將依賴的jar拷貝到target/lib目錄下 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build> </project>

無法重新打包時,修改META-INF\MANIFEST.MF文件且設置Class-Path

嘗試手動編輯MANIFEST.MF:

  • 手動編輯MANIFEST.MF。參考這里和這里。
  • 替換掉JAR中的MANIFEST.MF。
  • 盡量選擇個靠譜的壓縮包操作軟件,比如winrar。

    擴展知識(轉)

    自JDK 1.2以后,JVM采用了委托(delegate)模式來載入class.采用這種設計的原因可以參考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

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

    1. Bootstrap classes

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

    2. Extension classes

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

    3. User classes

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

    • 3.1 缺省值:調用Java或javawa的當前路徑(.),是開發的class所存在的當前目錄
    • 3.2 CLASSPATH環境變量設置的路徑.如果設置了CLASSPATH,則CLASSPATH的值會覆蓋缺省值
    • 3.3 執行Java的命令行-classpath或-cp的值,如果制定了這兩個命令行參數之一,它的值會覆蓋環境變量CLASSPATH的值
    • 3.4 -jar 選項:如果通過java -jar 來運行一個可執行的jar包,這當前jar包會覆蓋上面所有的值.換句話說,-jar 后面所跟的jar包的優先級別最高,如果指定了-jar選項,所有環境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會以jar包為搜索范圍.
      有關可執行jar有許多相關的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來全面了解.

    這也是為什么應用程序打包成可執行的jar包后,不管你怎么設置classpath都不能引用到第三方jar包的東西了.

    總結

    以上是生活随笔為你收集整理的java -jar 启动程序/设置classpath的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。