我在嘗試用 groovy 制作 shell 時遇到問題。我正在使用 groovy 3.0.9 并用我的 jar 編譯它。
有問題的代碼:
public class GrPlayerShell extends PlayerShell {
private final Groovysh groovysh;
private final PrintStream out;
private final PrintStream err;
protected GrPlayerShell(UUID uuid) {
super(uuid, GrShell.getInstance());
out = new PrintStream(new PlayerStream(uuid, false));
err = new PrintStream(new PlayerStream(uuid, true));
this.groovysh = new Groovysh(new IO(
new InputStream() {
@Override
public int read() throws IOException {
throw new IOException("Not implemented");
}
},
out,
err));
}
@Override
public void doExecute(String command) {
execute(command);
}
@Override
public Result execute(String command) {
if (command == null || command.isEmpty()) {
return Result.EMPTY;
}
Object result = groovysh.execute(command); // FIXME: 12/26/21 NoClassDefFoundError: groovy.lang.Script
return new Result(String.valueOf(result));
}
}
(也在這里)
在doExecute和execute在不同的執行緒中運行,以防止shell暫停一切,如果外殼需要一段時間來執行(例如while (true) {})。
這個 jar 也在運行時動態加載。
我已經用 java 8 和 17 進行了測驗,但兩者都給出了完全相同的結果。
只需將錯誤訊息包含在內即可:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during instruction selection: java.lang.NoClassDefFoundError: groovy/lang/Script
java.lang.RuntimeException: java.lang.NoClassDefFoundError: groovy/lang/Script
at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:976)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389)
at groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332)
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:526)
at groovy.lang.GroovyShell.parse(GroovyShell.java:538)
at groovy.lang.GroovyShell.parse(GroovyShell.java:570)
at groovy.lang.GroovyShell$parse$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)
at org.apache.groovy.groovysh.Interpreter.evaluate(Interpreter.groovy:76)
at org.apache.groovy.groovysh.Evaluator$evaluate.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
at org.apache.groovy.groovysh.Groovysh.execute(Groovysh.groovy:204)
at uwu.smsgamer.serverscripter.groovy.shell.GrPlayerShell.execute(GrPlayerShell.java:67)
at uwu.smsgamer.serverscripter.groovy.shell.GrPlayerShell.doExecute(GrPlayerShell.java:58)
at uwu.smsgamer.serverscripter.shell.PlayerShell$1.run(PlayerShell.java:86)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.NoClassDefFoundError: groovy/lang/Script
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at groovy.lang.GroovyClassLoader.access$400(GroovyClassLoader.java:90)
at groovy.lang.GroovyClassLoader$ClassCollector.createClass(GroovyClassLoader.java:700)
at groovy.lang.GroovyClassLoader$ClassCollector.onClassNode(GroovyClassLoader.java:717)
at groovy.lang.GroovyClassLoader$ClassCollector.call(GroovyClassLoader.java:721)
at org.codehaus.groovy.control.CompilationUnit$3.lambda$call$0(CompilationUnit.java:806)
at java.util.Optional.ifPresent(Optional.java:159)
at org.codehaus.groovy.control.CompilationUnit$3.call(CompilationUnit.java:806)
at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:942)
... 25 more
Caused by: java.lang.ClassNotFoundException: groovy.lang.Script
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
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 groovy.lang.GroovyClassLoader$InnerLoader.loadClass(GroovyClassLoader.java:607)
... 36 more
1 error
[09:49:47 WARN]: at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:295)
[09:49:47 WARN]: at org.codehaus.groovy.control.ErrorCollector.addException(ErrorCollector.java:143)
[09:49:47 WARN]: at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:976)
[09:49:47 WARN]: at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:671)
[09:49:47 WARN]: at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:635)
[09:49:47 WARN]: at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389)
[09:49:47 WARN]: at groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
[09:49:47 WARN]: at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330)
[09:49:47 WARN]: at groovy.lang.GroovyShell.parseClass(GroovyShell.java:526)
[09:49:47 WARN]: at groovy.lang.GroovyShell.parse(GroovyShell.java:538)
[09:49:47 WARN]: at groovy.lang.GroovyShell.parse(GroovyShell.java:570)
[09:49:47 WARN]: at groovy.lang.GroovyShell$parse$0.call(Unknown Source)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)
[09:49:47 WARN]: at org.apache.groovy.groovysh.Interpreter.evaluate(Interpreter.groovy:76)
[09:49:47 WARN]: at org.apache.groovy.groovysh.Evaluator$evaluate.call(Unknown Source)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
[09:49:47 WARN]: at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
[09:49:47 WARN]: at org.apache.groovy.groovysh.Groovysh.execute(Groovysh.groovy:204)
[09:49:47 WARN]: at uwu.smsgamer.serverscripter.groovy.shell.GrPlayerShell.execute(GrPlayerShell.java:67)
[09:49:47 WARN]: at uwu.smsgamer.serverscripter.groovy.shell.GrPlayerShell.doExecute(GrPlayerShell.java:58)
[09:49:47 WARN]: at uwu.smsgamer.serverscripter.shell.PlayerShell$1.run(PlayerShell.java:86)
[09:49:47 WARN]: at java.util.TimerThread.mainLoop(Timer.java:555)
[09:49:47 WARN]: at java.util.TimerThread.run(Timer.java:505)
我不知道為什么會發生這種情況,因為我Class.forName("groovy.lang.Script")之前放了一個,甚至創建了自己的類來擴展該腳本類,并且它們都可以正常作業。為什么 groovy 抱怨它自己的腳本類不存在,我不知道為什么。
普利茲幫助
uj5u.com熱心網友回復:
不是答案。只是一個猜測。
如果默認情況下您沒有為 groovysh 指定類加載器,則需要 Thread.currentThread().contextClassLoader
https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/Groovysh.groovy#L122
所以,在執行的時候currentThread().contextClassLoader不同于類加載器,它在你的測驗中是成功的Class.forName("groovy.lang.Script")
檢查執行緒背景關系類加載器是否可訪問 groovy 庫或在創建 groovish 物件時更改類加載器。
檢查您是否擁有運行時的所有 groovy 依賴項
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/394218.html
