簡體   English   中英

我如何跟蹤 java 在遍歷 CLASSPATH 時實際在尋找什么?

[英]How do I track what java is actually looking for as it traverses CLASSPATH?

開始啟動類的過程的 java 實用程序是如何告訴它在嘗試加載類時“泄露它的膽量”的?

特別是,它試圖訪問哪些文件路徑,只是為了發現它正在尋找的東西不存在,至少在它解釋給定的規范時? 有一種方法可以獲取該信息,但我現在找不到。

請注意,這是 Windows 10 上的 Java 版本“1.8.0_333”。

我已經通過 -h 和 -X 標志嘗試了我知道的每個標志,我強烈懷疑我正在尋找的是(曾經)一個已被刪除的 X 標志,就像 -X 幫助輸出警告一樣。 因此,必須有一種操作系統方法來解決這個問題,我當然希望!

你可能會問為什么? 不管是為了什么? 你想做什么? 嗯,這就是這個問題的大部分內容。 以機智:

作為 90 年代 Java 的早期用戶之一(我從 1.1 開始),我在將我在 Linux 上為我的公司編寫的應用程序套件遷移到 MS Windows 時遇到了問題,我使用 Cygwin 讓它工作. 一路走來,出現了同樣的問題,我非常清楚地記得找到了一種機制,可以讓 Java 啟動器明確說明它在搜索適當類時實際使用的文件規范 - 路徑。 通過使用它,我發現 CLASSPATH 被錯誤地指定了,並且通過一些實驗,我讓它可靠地工作。 現在我需要再做一次!

我使用的這個標志非常有助於確定文件規范格式CLASSPATH需要是什么(我們在這里不是在談論分號)這種 OS、Java 和 Cygwin 的組合。 經過幾個小時我希望是合理的狩獵之后,我想知道這個功能是否在某個時候被刪除了? 要么是那個,要么是“我在尋找錯誤的東西”。 哎呀,既然源是可用的(我想!),也許一些勇敢的靈魂已經破解了 java 實用程序來做這樣的事情?

這可能有助於理解,對於我為我的公司編寫的這個應用程序,主要目標是讓源代碼在所有 Windows 和 Linux/Unix 系統(以及當時的 macOS)上幾乎相同,並且只使用配置文件告訴代碼有什么不同。 這並不容易弄清楚,但是有了這面旗幟,也沒有那么難。

但是,不幸的是,自從我多年前想通了這一切以來,我就不需要這些知識了,而且顯然,今天很難找到這個小知識內核。 或者,它不再與現代版本相關。

我認為這與實際問題沒有太大關系,但如果他們理解場景,它可能有助於人們的思考:目前的情況是我在 Windows 7 上安裝了這個軟件的完整功能,用作比較如何在 Windows 10(希望更年輕)上進行配置。 Windows 7 正在運行一個非常現代的 Cygwin 安裝,並且幾乎是最現代的 Java - 與上周在 Windows 10 機器上的新安裝相比只是一個子版本。 (新盒子上的一切都煥然一新。)

在幾乎相同但功能齊全的 Windows 7 系統上, CLASSPATH所需的格式是:

CLASSPATH="C:/opt/OurInstallationDir/lib"

就是這樣。

這個值在幾個地方被提取,因為代碼稍后需要啟動 Java 本身來做一些不尋常的事情。 然而,讓這一切順利進行的 java 命令是從 C 程序啟動的——對於這個問題並不重要——但是 C 程序(在 Cygwin 下編譯,但可以在任何 Windows 環境中完美運行)有助於確保 Java 環境的安全(策略文件內容等)在進入 Java 之前,否則它會拒絕。 Windows 11 上的這個程序可以很好地啟動 Java,它只是給它一個沒有用的 CLASSPATH,顯然,即使文件在它們應該在的地方,等等。

像以前一樣配置東西是行不通的,即使從命令行也是如此。 如果指定 CLASSPATH 不僅僅是一個點,那么任何版本的指定 CLASSPATH 似乎都不起作用; 唯一有效的是在啟動和使用“-cp”時位於 /lib 目錄中。 ......但這只是因為很多原因而不會飛! 為了更清楚一點,我嘗試使用 /cygdrive/c/ 以及我能想到的任何其他方式來反轉斜線。 但是,至少我們知道,如果您在目錄中並使用 -cp,它將找到並啟動該程序。 因此,Java 沒有任何問題,只需將 java 實用程序指向它即可。

再說一遍:開始啟動類的過程的 java 實用程序是如何被告知在嘗試加載類時它正在做什么?

您在 JVM 上使用此構造:

java -XX:+TraceClassPaths -cp "C:\opt\SomeDirectory\lib" myClass

我能夠確認 Java 正在使用什么,不僅是為了我的 CLASSPATH,而且是通過使用上面的“內部”。

它與我正在做的事情和正在做的事情相呼應,這一事實讓我有洞察力去檢查它的一切。 如果 Java 安裝在它認為其中有鏈接的位置,Java 本身(根本)就不起作用,並且它自己的獲取可以直接返回到系統磁盤規范。

從那我發現Windows上的Java不會采用其中包含鏈接的CLASSPATH!

只需確保整個樹是從其所在驅動器的“頂部”指定的即可。 如果不是,它不會。

它現在可以使用上面提到的語法愉快地工作。

這與我在 Windows 上看到的所有其他應用程序完全不同。 但是,好吧,它是 Java!

這真的來自Mark Rotteveel的一個指針,他在上面評論了這篇文章: 如何跟蹤 jvm 中何時加載和銷毀類? 在其中,我學習了如何獲取當前使用的 JVM 支持的所有選項的列表。 在我看來,所有 Java 開發人員都應該意識到這一點,因此感謝 Mark。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM