GroovyShell和类路径

huangapple 未分类评论43阅读模式
标题翻译

GroovyShell and the classpath

问题

我开始使用Groovy进行编程,我想知道当我使用GroovyShell(new File("script.groovy").text)。evaluate()时,脚本类是否可以在类路径中看到依赖项,我尝试了这个例子,但产生了以下错误。

// main.groovy

@Grapes([
    @Grab(group='org.slf4j', module='slf4j-api', version='1.6.1'),
    @Grab(group='ch.qos.logback', module='logback-classic', version='0.9.28')
])

import groovy.lang.GroovyShell;
import java.io.File;

new GroovyShell().evaluate(new File("C:\\Users\\Dev\\Desktop\\logger.groovy").text);
// logger.groovy
import org.slf4j.*
import groovy.util.logging.Slf4j
 
@Slf4j
class HelloWorldSlf4j {
    def execute() {
        log.debug 'Execute HelloWorld.'
        log.info 'Simple sample to show log field is injected.'
    }
}
 
def helloWorld = new HelloWorldSlf4j()
helloWorld.execute()
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:869)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:979)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:967)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.codehaus.groovy.transform.LogASTTransformation$AbstractLoggingStrategy.classNode(LogASTTransformation.java:346)
	... 38 more
英文翻译

I'm starting to program with groovy and I wanted to know when I use GroovyShell (new File ("script.groovy"). txt) .evaluate (),
do script classes see dependencies in classpath or not, i try this example and it generate the following errors.

// main.groovy

@Grapes([
    @Grab(group='org.slf4j', module='slf4j-api', version='1.6.1'),
    @Grab(group='ch.qos.logback', module='logback-classic', version='0.9.28')
])

import groovy.lang.GroovyShell;
import java.io.File;

new GroovyShell().evaluate(new File("C:\\Users\\Dev\\Desktop\\logger.groovy").text);
// logger.groovy
import org.slf4j.*
import groovy.util.logging.Slf4j
 
@Slf4j
class HelloWorldSlf4j {
    def execute() {
        log.debug 'Execute HelloWorld.'
        log.info 'Simple sample to show log field is injected.'
    }
}
 
def helloWorld = new HelloWorldSlf4j()
helloWorld.execute()
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:869)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:979)
	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:967)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.codehaus.groovy.transform.LogASTTransformation$AbstractLoggingStrategy.classNode(LogASTTransformation.java:346)
	... 38 more

答案1

得分: 2

如果您希望 `logger.groovy` 文件与 `main.groovy` 脚本使用相同的类加载器,您需要通过 `GroovyShell` 构造函数将其传递。您可以通过调用 `this.class.classLoader` 来获取当前的类加载器。

<!-- language: lang-groovy -->

    @Grapes([
        @Grab(group='org.slf4j', module='slf4j-api', version='1.6.1'),
        @Grab(group='ch.qos.logback', module='logback-classic', version='0.9.28')
    ])
    
    import groovy.lang.GroovyShell
    import java.io.File
    
    new GroovyShell(this.class.classLoader).evaluate(new File("logger.groovy"))

输出:

$ groovy main.groovy
16:17:11.325 [main] DEBUG HelloWorldSlf4j - 执行 HelloWorld。
16:17:11.327 [main] INFO HelloWorldSlf4j - 简单示例,显示日志字段已注入。

英文翻译

If you want logger.groovy file to use the same classloader as main.groovy script, you need to pass it with the GroovyShell constructor. You can get the current classloader by calling this.class.classLoader.

<!-- language: lang-groovy -->

@Grapes([
    @Grab(group=&#39;org.slf4j&#39;, module=&#39;slf4j-api&#39;, version=&#39;1.6.1&#39;),
    @Grab(group=&#39;ch.qos.logback&#39;, module=&#39;logback-classic&#39;, version=&#39;0.9.28&#39;)
])

import groovy.lang.GroovyShell
import java.io.File

new GroovyShell(this.class.classLoader).evaluate(new File(&quot;logger.groovy&quot;))

Output:

$ groovy main.groovy
16:17:11.325 [main] DEBUG HelloWorldSlf4j - Execute HelloWorld.
16:17:11.327 [main] INFO  HelloWorldSlf4j - Simple sample to show log field is injected.

huangapple
  • 本文由 发表于 2020年3月16日 23:08:48
  • 转载请务必保留本文链接:https://java.coder-hub.com/60708434.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定