【问题标题】:How to convert a .java or a .jar file into a Linux executable file ( without a .jar extension, which means it's not a .jar file )如何将 .java 或 .jar 文件转换为 Linux 可执行文件(没有 .jar 扩展名,这意味着它不是 .jar 文件)
【发布时间】:2015-06-08 09:54:45
【问题描述】:

我一直在寻找许多关于此的类似帖子,但我仍然找不到我的答案。我想将 .java 程序转换为 Linux 可执行文件,不带 .jar 扩展名。我该怎么做?我正在尝试使用 Launch4j java wrapper、JWrapper、IzPack、制作 .sh、制作 .bat、使用 java -jar myFile.jar 等运行它,但它们都不起作用。有些程序很复杂,很难调试。是否有任何直接的方法可以将 .java 文件或 .jar 文件转换为 Linux 可执行文件?

我需要将此程序作为一个整体的 Linux 可执行文件传递给另一个程序,该程序将此程序作为参数。

【问题讨论】:

  • 为什么你只想为 linux 制作 .sh 文件?我猜 java 的美妙之处在于跨平台,你只需要安装 JRE,一个 jar 就可以在任何操作系统上完美运行。
  • 我尝试过制作一个 .sh 文件,但它不起作用。原因是因为我有一个由其他人修复和编写的主程序,我只能将我的程序作为 Linux 可执行文件(而不是 .jar)传递给它。我正在使用 Java 开发它。
  • @pythonhiew :我想你也可以使用 java -jar fileName.jar 之类的命令运行 jar。你为什么不做一个 bash 来运行命令和你的 JAR。
  • 我不明白为什么 .sh 脚本与“linux 可执行文件”有任何不同,它也是可执行文件。大部分 linux 可执行文件实际上是脚本——如果这不起作用,那么我也看不到任何其他可执行文件将如何工作。另外:Launch4j 用于创建本机 Windows 可执行文件,我看不出这对 Linux 环境有什么帮助。
  • 确保你的 .sh 文件是真正可执行的(chmod +x yourfile.sh),也许这就是问题所在。如果您将 shell 脚本传递给的工具不喜欢 .sh 结尾,只需将其重命名,省略 .sh 结尾即可。

标签: java linux eclipse wrapper executable


【解决方案1】:

假设您有一个名为 helloworld.jar 的可运行 jar

将下面的 Bash 脚本复制到一个名为 stub.sh 的文件中

#!/bin/sh
MYSELF=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java=java
if test -n "$JAVA_HOME"; then
    java="$JAVA_HOME/bin/java"
fi
java_args=-Xmx1g
exec "$java" $java_args -jar $MYSELF "$@"
exit 1 

然后将 jar 文件附加到保存的脚本,并使用以下命令授予对生成的文件的执行权限:

cat stub.sh helloworld.jar > helloworld.run && chmod +x helloworld.run 

就是这样!

现在您只需在 shell 终端上输入 helloworld.run 即可执行应用程序。

脚本足够聪明,可以透明地将任何命令行参数传递给 Java 应用程序。

致谢:保罗·迪·托马索

来源:https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

【讨论】:

  • $java_args 是什么?
  • 它可以是任何 JVM 参数,如 -Xmx、-Xms 等...示例已更新。
  • 如果用户仍然需要在他的机器上安装 JRE,那么这个 shell 包装器的意义何在。我们需要类似pyinstaller for java
  • 嗨@pouya,重点是避免每次调用Java程序(JAR文件)时都需要在前面加上“java -jar your.jar”,这样你就可以把你的可执行脚本放在系统路径并将其作为任何普通命令/二进制文件从任何地方调用。尤其是国内很多用户不明白什么是JAR文件,在我的选择下,他们不需要用Java写的软件。
【解决方案2】:

经过数小时的搜索和尝试,我找到了一个解决方案,这正是我想要的。就是在linux中使用gcj命令。

它的工作方式类似于用于 C 的 gcc 和用于 C++ 的 g++,它们将 C 或 C++ 程序编译为可执行文件。

首先使用终端安装 gcj,输入:

sudo apt-get install gcj-jdk

之后,cd到.jar文件所在的目录,假设.jar文件是myFile.jar,那么:

gcj myFile.jar -o newNameofTheFile --main=theMainClassNameofTheFile

编译 .jar 文件。它应该像可执行文件一样工作,只需像这样在命令行中运行它:

./newNameofTheFile

【讨论】:

  • gcj 多年来一直被认为已过时。
  • 是的 chrylis 但是在我尝试了所有方法之后它仍然有效。就像使用 java -jar myFile.jar 等运行它或使用 .bat、.sh 一样,都失败了。然而,这很成功。因为我要把这个编译好的程序作为参数传递给另一个程序,而另一个程序不接受任何形式的参数,即.jar、.sh、.bat,除非经过gcj编译后。
  • @pythonhiew 很好,但如果您使用现代 Java 构造,它将无法工作,如果您对性能最不感兴趣,这样做真的不是一个好主意。这是一个紧急解决方案,仅此而已。
  • 我自己没有尝试过,但对于任何感兴趣的人,this 应该会让你感兴趣(tl;dr:它确实已经过时了)。
【解决方案3】:

你可以做一个很小的 ​​C 程序,它调用一个 exec 函数(参见 man 3 exec)到“java”二进制文件,传递“-jar”、“xxx.jar”作为参数,另见Forking a new process in C++ and executing a .jar file

【讨论】:

  • 布拉姆感谢您的回答。我找到了一个简单的解决方案,并在下面发布了答案。
  • 无论如何我都赞成你的回答,因为它是有道理的。我没试过,但这是个好主意。
【解决方案4】:

将 jar 转换为 Linux 可执行文件的另一个简单技巧是在 jar 文件之前放置一个 shebang。

假设我们有一个 hello.jar 文件。

$ java -jar hello.jar
hello world!

您可以按照以下步骤创建可执行文件。

$ echo "#! /usr/bin/env java -jar" > hello
$ cat hello.jar >> hello
$ chmod +x hello

然后,你就可以直接执行hello文件了。

$ ./hello
hello world!

【讨论】:

猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2011-08-18
  • 2012-05-04
  • 2020-07-10
  • 2014-12-31
  • 2014-01-17
相关资源
最近更新 更多