【问题标题】:Why can't classes in the same package see each other automagically?为什么同一个包中的类不能自动看到对方?
【发布时间】:2011-06-17 16:37:31
【问题描述】:

为什么当我运行 Eclipse Groovy 项目时,同一包中的脚本彼此不可见?为什么我必须明确定义脚本引擎的目录。为什么 new 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类似的问题。

【问题讨论】:

  • 自动还是自动?
  • 我不自觉地讨厌这个词

标签: java groovy package packages


【解决方案1】:

在 groovy 中和在 java 中一样,您必须将源文件夹和包的概念分开。 在您的情况下,源文件夹是“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 )

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

【讨论】:

  • 感谢您的帮助。我希望我所看到的不寻常,但似乎并非如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2011-03-21
  • 2014-03-28
  • 2023-03-17
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多