我有一个使用 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\ninvalid 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\nManifest-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大多数文件格式以固定的字节组合或“幻数”开头。
例如,Java 类文件以字节或“幻数”0xcafebabe 开头。
您的系统需要能够识别文件类型并知道使用什么来执行该文件。
您的系统不知道如何直接执行 jar 档案,并且 unix 系统配置为这样做是不典型的。
在 ubuntu 上,可以使用 binfmt-support 包启用此功能。
另一种解决方案是将启动脚本嵌入到存档文件的头部,但这有点hacky。
基本上,操作系统将文件识别为 shell 脚本,然后脚本本身调用命令java
。
例如,spring-boot 插件就能够利用这种技术,它们嵌入了一个允许直接执行 jar 文件的脚本,以及作为 init 启动停止脚本工作。
归档时间: |
|
查看次数: |
4120 次 |
最近记录: |