criyle / go-judge

Sandbox Server in REST / gRPC API. Based on Linux container technologies.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

运行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安装的。

@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 是否存在。

好的,谢谢。这个文件是有的。我直接在命令行编译时没问题的。

可以去 action 下载一个 go-judge-shell 看看沙箱里面有没有这个文件。

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错误。我查一下其他人是否碰到这个问题。
谢谢!🙏