运行Java程序问题
alexwenbj opened this issue · comments
您好。
我直接在Ubuntu上安装的go-judge编译好的文件,现在可以编译运行C++/C/Python等。
然后我再安装了OpenJDK21,但编译的时候报错:
"error": "start: /usr/lib/jvm/java-21-openjdk-amd64/bin/javac: execve: no such file or directory"
我在Linux命令行是可以运行的,配置文件如下:
[
"args" => ["/usr/lib/jvm/java-21-openjdk-amd64/bin/javac", "Main.java"],
"env" => ["PATH=/usr/lib/jvm/java-21-openjdk-amd64/bin/:/usr/bin:/bin"],
"files" => [
["content" => ""],
["name" => "stdout", "max" => 10240],
["name" => "stderr", "max" => 10240]
],
"cpuLimit" => 10000000000,
"memoryLimit" => 104857600,
"procLimit" => 50,
"copyIn" => [
"Main.java" => [
"content" => $code
]
],
"copyOut" => ["stdout", "stderr"],
"copyOutCached" => ["Main.class"]
]
安装jdk后我重新启动了go-judge。谢谢!
可以试试下载 mount.yaml 然后把 /etc/java-17-openjdk
的那几行的 17 改成 21,放在沙箱可执行文件同目录或者用 -mount-conf
参数指定配置文件位置。重启程序。
@criyle 谢谢回复。不过我没有用docker,我是直接在Linux安装的。
有没有一种可能就是我的回复并没有提到 docker 也不是给 docker 的解决方案
谢谢。不过配置了还是不行,还是报一样的错误。我看启动时加载了配置文件:
sudo /usr/bin/go-judge -mount-conf=/etc/go-judge/mount.yaml -http-addr=0.0.0.0:5050 -file-timeout=10m
2024-05-08T09:35:17.616+0800 INFO go-judge/main.go:58 config loaded: &{ContainerInitPath: PreFork:1 TmpFsParam:size=128m,nr_inodes=4k NetShare:false MountConf:/etc/go-judge/mount.yaml SeccompConf:seccomp.yaml Parallelism:8 CgroupPrefix:gojudge ContainerCredStart:0 SrcPrefix:[] Dir: TimeLimitCheckerInterval:100ms ExtraMemoryLimit:16.0 KiB OutputLimit:256.0 MiB CopyOutLimit:256.0 MiB OpenFileLimit:256 Cpuset: EnableCPURate:false CPUCfsPeriod:100ms FileTimeout:10m0s HTTPAddr:0.0.0.0:5050 EnableGRPC:false GRPCAddr:localhost:5051 MonitorAddr:localhost:5052 AuthToken: GRPCMsgSize:64.0 MiB EnableDebug:false EnableMetrics:false Release:false Silent:false ForceGCTarget:20.0 MiB ForceGCInterval:5s Version:false}
2024-05-08T09:35:17.616+0800 INFO env/env_linux.go:62 Created container mount at:Mounts: bind[/bin:bin:ro], bind[/lib:lib:ro], bind[/lib64:lib64:ro], bind[/usr:usr:ro], bind[/etc/ld.so.cache:etc/ld.so.cache:ro], bind[/etc/alternatives:etc/alternatives:ro], bind[/dev/null:dev/null:rw], bind[/etc/java-21-openjdk:etc/java-21-openjdk:ro], bind[/dev/urandom:dev/urandom:rw], bind[/dev/random:dev/random:rw], bind[/dev/zero:dev/zero:rw], bind[/dev/full:dev/full:rw], tmpfs[w], tmpfs[tmp], proc[ro]
还是一样的错误:
"error": "start: /usr/lib/jvm/java-21-openjdk-amd64/bin/javac: execve: no such file or directory"
改成/usr/bin/javac
(软连接到/usr/lib/jvm/java-21-openjdk-amd64/bin/javac
)也是一样的报错。
Ubuntu 24.04 apt install openjdk-21-jdk
运行没有问题,无法复现,请检查 /usr/lib/jvm/java-21-openjdk-amd64/bin/javac
是否存在。
好的,谢谢。这个文件是有的。我直接在命令行编译时没问题的。
OK。另外编译的时候完整的输出是:
[
{
"status": "Internal Error",
"exitStatus": 0,
"error": "start: \/usr\/bin\/javac: execve: no such file or directory",
"time": 296640,
"memory": 131072,
"runTime": 0,
"files": {
"stderr": "",
"stdout": ""
},
"fileError": [
{
"name": "Main.class",
"type": "CopyOutOpen",
"message": "open Main.class: no such file or directory"
}
]
}
]
有点疑惑这里的错误是指javac没找到还是Main.class没找到?
我先切换到17,可以了。谢谢!
还有其他问题我再来请教。
javac
没找到,有可能是 javac
软连接到的文件在沙箱里面不存在
有可能。我有时间再仔细检查一下。现在是能编译了,但发生Error: Could not find or load main class Main Caused by: java.lang.ClassNotFoundException: Main
错误。我查一下其他人是否碰到这个问题。
谢谢!🙏