Re: [問題] package 與 classpath 的問題
※ 引述《sawfish (板釘龍史)》之銘言:
: 《 Case 2 》
: 我將 myTest.java 放在 e:\myJava\myTest 下,編譯的方法如同 case 1,一樣可以
: 正確編譯,但是在執行時,使用 case 1 的方法確不行執行,並出現以下的錯誤:
: Exception in thread "main" java.lang.NoClassDefFoundError: myTest
<del>
: 我一直找不出個所以然,後來我參考了其它書本,修改了一個小地方,就能順利執行了。
: 原本在 case 1 中執行的方法我改成了
: java -cp e:\myJava; myTest
: 只是加了一個分號,就可以執行了,我對這個問題一直很疑惑,想請教板眾,希望能為
: 我解答一下。
: 我所使用的是 1.6.0_05 這個版本。
我試了一下的結論是
執行時會由你所指定的classpath下去搜所要執行的class
如果有指定且沒有包含當前工作目錄就不會去找當前工作目錄
就你的例子來說
Case 1是這樣:
e:\myJava\ ←classpath在這裡
|--myTest.class
|--myData
|--math
|--CBox.class
於是jvm就會在e:\myJava下面找myTest去跑
Case 2則是:
e:\myJava\ ←classpath在這裡
|--myTest
|--myTest.class
|--myData
|--math
|--CBox.class
jvm一樣在e:\myJava下面去找myTest 發現找不到
但因為你沒說要在工作目錄找 jvm就沒去找 直接噴一個NoClassDefFoundError出來
你可以試著在Case 2的情形下放一個內容稍有不同的myTest.class在e:\myJava\
再在myTest\下用Case 2的方法去跑 會發現執行到的是在e:\myJava\的那一個
而這個解決方法是因為classpath指定是用;分開各個選項
所以你後來那個就成了"指定classpath為(依序) e:\myJava\ 和 (空)"
這個(空)就被解釋成 . 也就是當前工作目錄 所以就找到了
--
上兩行我加了(依序)兩個字 因為jvm是依照這順序去找class
也就是說 在上面我寫的那個Case 2'的情形下
用 java -cp e:\myJava\; myTest
和用 java -cp ;e:\myJava\ myTest
兩個執行到的myTest是不同個
前一個是執行e:\myJava\那個 後一個是當前工作目錄那一個(ie. myJava\myTest\那個)
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █▄▄▄▄▄
▍./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏ζ(▏●‵◥′●▊)Ψ ▏ █ ⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主義 █▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界を大いに盛り上げるための涼宮ハルヒの団
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.84
推
04/23 08:10, , 1F
04/23 08:10, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):