为什么同一个包中的类不能自动地看到对方?

时间:2011-06-17 04:13:49

标签: java groovy package packages

为什么在运行Eclipse Groovy项目时,脚本在同一个包中彼此不可见?为什么我必须明确定义脚本引擎的目录。为什么不 新的GroovyScriptEngine(“C:/ Eclipse / workspace / Stack / src”) 工作?

package com.test
import groovy.lang.Binding
import groovy.util.GroovyScriptEngine
Binding binding = new Binding()
// explicitly defined path to where Hello.groovy script is located
GroovyScriptEngine gse = new GroovyScriptEngine( "C:/Eclipse/work/S/src/com/test" )
gse.run( "Hello.groovy", binding )

另一种有效的方法是:

GroovyScriptEngine gse = new GroovyScriptEngine( [ './com/test' ] as String[] )
gse.run( "Hello.groovy", binding )

当我尝试使用src目录中的脚本引擎运行时出现的错误是:

// project working directory is C:/Eclipse/work/S/src
GroovyScriptEngine gse = new GroovyScriptEngine( "C:/Eclipse/work/S/src" )
.....
Caught: groovy.util.ResourceException: 
    Cannot open URL: file:/C:/Eclipse/work/S/src/Hello.groovy
    at com.test.TestExample.run(TestExample.groovy:9)

这是与this类似的问题。

1 个答案:

答案 0 :(得分:0)

在java中像groovy一样,你必须分离源文件夹和包的概念。 您的案例中的源文件夹是“C:/ Eclipse / work / S / src”,包是“com.test”。

如果在GroovyScriptEngine中指定“C:/ Eclipse / work / S / src”,则需要完全指定类(即“com / test / Hello.groovy”),即使调用类是相同的包。

由于“Hello.groovy”在“C:/Eclipse/work/S/src/com/test/Hello.groovy”中(我猜),

GroovyScriptEngine gse = new GroovyScriptEngine( "C:/Eclipse/work/S/src" )
gse.run( "Hello.groovy", binding )

还不够。您缺少“com / test”,因此您要么指定

GroovyScriptEngine gse = new GroovyScriptEngine( "C:/Eclipse/work/S/src/com/test" )
gse.run( "Hello.groovy", binding )

GroovyScriptEngine gse = new GroovyScriptEngine( "C:/Eclipse/work/S/src" )
gse.run( "com/test/Hello.groovy", binding )

我认为后一种情况“更正确”。