使用“java -jarexecutable.jar”执行 Jar 是可以的,但即使具有执行权限,“./executable.jar”也会返回“Bad Magic Number”

Jon*_*els 5 java jar maven

我有一个使用 Maven 构建的小应用程序:

\n\n
            <plugin>\n            <groupId>org.apache.maven.plugins</groupId>\n            <artifactId>maven-assembly-plugin</artifactId>\n            <configuration>\n                <archive>\n                    <manifest>\n                        <mainClass>be.scripts.batchconverter.MainScript</mainClass>\n                    </manifest>\n                </archive>\n            </configuration>\n            <executions>\n                <execution>\n                    <id>create-executale-jar</id>\n                    <phase>package</phase>\n                    <goals>\n                        <goal>single</goal>\n                    </goals>\n                    <configuration>\n                        <finalName>batchconverter</finalName>\n                        <appendAssemblyId>false</appendAssemblyId>\n                        <descriptorRefs>\n                            <descriptorRef>jar-with-dependencies</descriptorRef>\n                        </descriptorRefs>\n                    </configuration>\n                </execution>\n            </executions>\n        </plugin>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以使用“java -jar batchconverter”运行它,但是当我尝试使用“chmod +x batchconverter.jar”然后“./batchconverter.jar”执行它时,我收到此一般错误:

\n\n
invalid file (bad magic number): Exec format error\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 JDK 是 oracle,“1.8.0_121”,我安装了 binfmt 支持,并且运行的是 ubuntu 16.04

\n\n

这是清单:

\n\n
Manifest-Version: 1.0\nArchiver-Version: Plexus Archiver\nBuilt-By: jschoreels\nCreated-By: Apache Maven 3.3.9\nBuild-Jdk: 1.8.0_121\nMain-Class: be.scripts.batchconverter.MainScript\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及 ls 结果(证明 x 权限)

\n\n
-rwxrwxr-x 1 jschoreels jschoreels 4,9M M\xc3\xa4r  7 11:40 batchconverter.jar\n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么办法可以确定原因吗?

\n

Mag*_*nus 3

大多数文件格式以固定的字节组合或“幻数”开头。
例如,Java 类文件以字节或“幻数”0xcafebabe 开头。

您的系统需要能够识别文件类型并知道使用什么来执行该文件。
您的系统不知道如何直接执行 jar 档案,并且 unix 系统配置为这样做是不典型的。

在 ubuntu 上,可以使用 binfmt-support 包启用此功能。

另一种解决方案是将启动脚本嵌入到存档文件的头部,但这有点hacky。
基本上,操作系统将文件识别为 shell 脚本,然后脚本本身调用命令java

例如,spring-boot 插件就能够利用这种技术,它们嵌入了一个允许直接执行 jar 文件的脚本,以及作为 init 启动停止脚本工作。