2017-09-24 86 views
4

在Java 9發佈後,我正在使用JShell,並嘗試導入我製作的包。由於我爲它編寫的整個應用程序將包含在該包中,除了一個類(我還沒有編碼),每個類都是包私有的。我的類路徑是正確的,但我仍然無法使用JShell包中聲明的任何類型(它會引發「無法找到符號」錯誤)。 我是否需要讓它們公開才能使用它們,或者有什麼方法可以測試包私有類?這是我嘗試的確切代碼。將包私有類導入到JShell中

我的當前目錄是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src 

我的類路徑是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls 

和封裝目錄(字節碼)是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls\collatz 

CollatzSequence是套餐的包含在中的私人課程。

PS C:\Users\Sylvaenn> cd OneDrive\Documents\Programs\Java\src 
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> jshell 
| Welcome to JShell -- Version 9 
| For an introduction type: /help intro 

jshell> import collatz.*; 

jshell> CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
| Error: 
| cannot find symbol 
| symbol: class CollatzSequence 
| CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
| ^-------------^ 
| Error: 
| cannot find symbol 
| symbol: class CollatzSequence 
| CollatzSequence seq = new CollatzSequence(BigInteger.ONE); 
|       ^-------------^ 

jshell> /imports 
| import java.io.* 
| import java.math.* 
| import java.net.* 
| import java.nio.file.* 
| import java.util.* 
| import java.util.concurrent.* 
| import java.util.function.* 
| import java.util.prefs.* 
| import java.util.regex.* 
| import java.util.stream.* 
| import collatz.* 

jshell> 
+2

能否請您分享的情況下可重複的代碼?這將有助於明確問題。 – nullpointer

+1

我只是將它包含在我的編輯中。 –

回答

1

據我所知(糾正我,如果我錯了),你不能在一個特定的軟件包使用JShell創建一個類(內JShell創建的課總是默認包)。

這就是說,你不能從JShell中訪問你的包私有類。這是「正常」的Java行爲。

+0

關於在特定的包中創建類,我無法找到一種方法來使用JShell命令,否則它是有道理的,你將無法這樣做,但我不知道肯定。而且我認爲無法訪問包私有類也是有意義的,但這是一個巨大的失望。 –

2

從JEP#220 - The Java Shell (Read-Eval-Print Loop)

一個片段可能不聲明一個包或模塊。所有JShell代碼是 放置在一個未命名模塊的單個包中。該軟件包的名稱由JShell控制。

這就是爲什麼您無法在JShell中聲明package的原因。


由於tool documentation建議雖然你可以試試這個: -

默認的啓動腳本是由幾種常見的進口。您可以使用/set start命令來個性化啓動條目。

在那裏你可以set the classpath或者你會使用的類the modulepath

jshell --class-path C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls 
+0

非常有用的信息,但我沒有試圖聲明一個新的包;我試圖訪問現有的包私有類。我的班級路徑已經指向了正確的目錄,但我會嘗試在shell中明確地設置它。但是,我認爲接受的答案是正確的。 JShell只能訪問公共類。 –