2017-09-24 87 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只能访问公共类。 –