为什么我的 jar 文件不能在双击时启动?
Why doesn't my jar file launch on double click?
我在双击启动 jar 文件时遇到问题(并使用 java SE 打开),jar 从命令行启动得很好,我创建的其他 jar 可以通过双击启动。
我使用 eclipse exporter 导出了 jar 文件,我使用了 运行nable jar export 并在 运行 配置下选择了正确的 main() class
当我 运行 使用 java -jar myjar.jar
jar 时,它 运行 如预期的那样没有抛出异常
我在 linux/windows 下都有同样的问题我真的不明白这一点,因为我使用相同的方式创建的其他 jar 文件 运行 没有任何问题。
Just for fun I created a c
program containing only
int main(void){
system("java -jar myjar.jar");
return 0;
}
When I double clicked the compiled c
program my jar opened up !
这是清单
Manifest-Version: 1.0
Class-Path: . libs/commons-compress-1.10.jar libs/zip4j_1.3.2.jar libs/xz.jar libs/commons-io-2.4.jar libs/oat2dex.jar
Main-Class: deodex.Tester
这是 main
方法:
http://pastebin.com/M8Fhb4qW
package deodex;
import deodex.tools.Logger;
import deodex.ui.LangFrame;
import deodex.ui.Window;
public class Tester {
public static void main(String args[]) {
if (Cfg.isFirstLaunch()) {
Cfg.setCurrentLang(S.ENGLISH);
R.initResources();
@SuppressWarnings("unused")
LangFrame win = new LangFrame();
} else {
Cfg.readCfg();
R.initResources();
S.initTempFolders();
Logger.logToStdIO("[test]" + Cfg.getCurrentLang());
@SuppressWarnings("unused")
Window win = new Window();
}
}
}
提前致谢
更多详情
我尝试在我的代码之前添加一个新的 JFrame
,双击只对显示的那个 JFrame
起作用,然后它挂在那里,另一个 Windows 应该在那之后启动出现,请告诉我在哪里看...为什么它不起作用?因为看起来我的 Classes 扩展 JFram
需要 terminal/cmd 出现,我还应该注意我正在使用一个名为 R
的 class 来加载来自文本文件的字符串取决于语言和 Cfg
Class 检查程序是否首次启动或之前启动过,然后加载正确的语言文件和资源。
编辑
正如答案中所建议的那样,我删除了所有 JDK 并安装了 Oracle 的 JDk 仍然存在相同的问题
问题可能出在 Java SE 运行时环境安装不当。可能需要从您的计算机上卸载 Java 的所有痕迹,然后使用来自 Oracle Technology Network.
的离线安装程序重新安装 Java
在 Linux 上,添加 PPA ppa:webupd8team/java
并安装 oracle-java8-installer
- 据我所知,它与许多桌面环境集成,至少它与 Ubuntu Unity 和 XFCE,所以双击也应该在那里工作。
我解决了我自己的问题是为什么:
正如我在细节中所说,我使用 JAR
文件外部的文本资源,并且我使用硬代码来获取这些资源,例如 final File("lang/en.prop");
事情是从 GUI
启动时用 JAVA SE ,它就像 运行 从其他目录向我的 jar 发出的命令会失败,因为 Cfg
class 会抛出 NullPointerException 因为文本资源不存在所以我做了一个新的 Class 像这样叫它 PathUtils
PathUtils.java
public static String getExcutionPath(){
String path = "";
try {
path =PathUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Somthing went wrong couldn't detemine our current location !");
}
return path.substring(0, path.lastIndexOf("/"));
}
现在在 Launch 上,我将首先找到我在文件系统上的位置,然后根据我当前的位置为我的程序设置所需文件的值,现在双击非常有用!简单
我在双击启动 jar 文件时遇到问题(并使用 java SE 打开),jar 从命令行启动得很好,我创建的其他 jar 可以通过双击启动。
我使用 eclipse exporter 导出了 jar 文件,我使用了 运行nable jar export 并在 运行 配置下选择了正确的 main() class
当我 运行 使用 java -jar myjar.jar
jar 时,它 运行 如预期的那样没有抛出异常
我在 linux/windows 下都有同样的问题我真的不明白这一点,因为我使用相同的方式创建的其他 jar 文件 运行 没有任何问题。
Just for fun I created a
c
program containing only
int main(void){
system("java -jar myjar.jar");
return 0;
}
When I double clicked the compiled
c
program my jar opened up !
这是清单
Manifest-Version: 1.0
Class-Path: . libs/commons-compress-1.10.jar libs/zip4j_1.3.2.jar libs/xz.jar libs/commons-io-2.4.jar libs/oat2dex.jar
Main-Class: deodex.Tester
这是 main
方法:
http://pastebin.com/M8Fhb4qW
package deodex;
import deodex.tools.Logger;
import deodex.ui.LangFrame;
import deodex.ui.Window;
public class Tester {
public static void main(String args[]) {
if (Cfg.isFirstLaunch()) {
Cfg.setCurrentLang(S.ENGLISH);
R.initResources();
@SuppressWarnings("unused")
LangFrame win = new LangFrame();
} else {
Cfg.readCfg();
R.initResources();
S.initTempFolders();
Logger.logToStdIO("[test]" + Cfg.getCurrentLang());
@SuppressWarnings("unused")
Window win = new Window();
}
}
}
提前致谢
更多详情
我尝试在我的代码之前添加一个新的 JFrame
,双击只对显示的那个 JFrame
起作用,然后它挂在那里,另一个 Windows 应该在那之后启动出现,请告诉我在哪里看...为什么它不起作用?因为看起来我的 Classes 扩展 JFram
需要 terminal/cmd 出现,我还应该注意我正在使用一个名为 R
的 class 来加载来自文本文件的字符串取决于语言和 Cfg
Class 检查程序是否首次启动或之前启动过,然后加载正确的语言文件和资源。
编辑
正如答案中所建议的那样,我删除了所有 JDK 并安装了 Oracle 的 JDk 仍然存在相同的问题
问题可能出在 Java SE 运行时环境安装不当。可能需要从您的计算机上卸载 Java 的所有痕迹,然后使用来自 Oracle Technology Network.
的离线安装程序重新安装 Java在 Linux 上,添加 PPA ppa:webupd8team/java
并安装 oracle-java8-installer
- 据我所知,它与许多桌面环境集成,至少它与 Ubuntu Unity 和 XFCE,所以双击也应该在那里工作。
我解决了我自己的问题是为什么:
正如我在细节中所说,我使用 JAR
文件外部的文本资源,并且我使用硬代码来获取这些资源,例如 final File("lang/en.prop");
事情是从 GUI
启动时用 JAVA SE ,它就像 运行 从其他目录向我的 jar 发出的命令会失败,因为 Cfg
class 会抛出 NullPointerException 因为文本资源不存在所以我做了一个新的 Class 像这样叫它 PathUtils
PathUtils.java
public static String getExcutionPath(){
String path = "";
try {
path =PathUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Somthing went wrong couldn't detemine our current location !");
}
return path.substring(0, path.lastIndexOf("/"));
}
现在在 Launch 上,我将首先找到我在文件系统上的位置,然后根据我当前的位置为我的程序设置所需文件的值,现在双击非常有用!简单