我最近开发了一些我希望其他人在他们的机器上运行的java应用程序。 我做了一些研究,现在知道要分发java代码,你需要创建.jar文件。 嗯,我做到了,但当我分发这些文件时,它运行在一些计算机上,但在其他计算机上它返回错误说:“主类无法找到”。
答案 0 :(得分:2)
选项1:创建一个清单文件,其条目如下所示,并包含在jar中:
Main-Class: MainProgram
选项2:在运行程序时,只需提及您的Main
班级名称,例如如果jar
名称为myprogram.jar
且主要类别为MainProgram
,则按以下方式运行该程序:
java -cp myprogram.jar MainProgram
如果你的MainProgram
接受一些参数,他们也会在命令行中传递它们,例如
java -cp myprogram.jar MainProgram argument1 argument2
答案 1 :(得分:0)
某些SDK(如Eclipse)具有创建jar文件的功能。 如果您在控制台上工作,这可能会帮助您创建稳定的jar文件:
'jar cfm className.jar MANIFEST.MF className.class'
答案 2 :(得分:0)
错误消息表明JRE无法找到您的主类。从评论看起来您没有正确指定清单。它是否包含在jar内的META-INF目录中? jar -tf my_jar.jar
告诉你什么?
如果您担心JRE版本,请尝试在javac命令中指定较低的目标版本。您可以在-target xx
调用中添加javac
,也可以-source xx
添加javac -help
。请查看{{1}}以获取有关标志的说明。
答案 3 :(得分:0)
您可以使用jlink。它随JDK一起提供。它有助于分发应用程序,而无需安装Java。
Using Java 9 Modularization to Ship Zero-Dependency Native Apps提到-
jlink仅将精简的JRE与那些您的 应用程序需求。
甲骨文博客文章Faster and Easier Use and Redistribution of Java SE提到-
使用JDK 9随附的“ jlink”工具将使其变得更加容易 供应用程序开发人员打包和部署专用运行时 而不是依赖预先安装的系统JRE。
现在回答您的两个问题-
如果使用jlink,则用户不必知道他/她应在哪个版本上运行该应用程序。此外,您可以将正确的JRE版本与您的App打包在一起。更清楚地说,自JDK 11起, Java运行时环境(JRE)就不存在了。jlink将为您构建专用的JRE。
在此版本中,不再提供JRE或Server JRE。只有 提供了JDK。用户可以使用jlink创建较小的自定义运行时。
Reddit has a nice comment关于此问题。
不再有单独的JRE,只有包含所有JRE的JDK 部分(例如Java二进制文件)。 此外,除非您使用OracleJDK,否则请不要使用 打算付钱给他们。 OpenJDK是新的默认设置。