我已经成功地创建了一个Java程序,它可以在我的开发计算机上正常运行,无论是在Netbeans中还是在.jar文件中(双击)。问题是它不会在没有JDK的计算机上启动,也不会在没有java -jar jarfile.jar的命令行中启动(注意,如果没有-jar标志,它就不会启动)。
在开发计算机上,如果命令行上没有-jar标志,则jar文件也不会运行。
在程序无法启动的所有情况下,我得到的错误如下所示。
S:\Folder>Program.jar
Exception in thread "main" java.lang.NoClassDefFoundError: S:\Folder\Program/jar
Caused by: java.lang.ClassNotFoundException: S:\Folder\Program.jar
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: S:\Folder\Program.jar. Program will exit.Program.jar的文件结构如下所示:
Program.jar
binlib
build.xml
manifest.mf
onejar.mf
one-jar-ant-task.xml
com
simontuffs
onejar
a lot of classes related to OneJar
doc
one-jar-license.txt
lib
itextpdf-5.3.3.jar
main
main.jar
my
package
all the classes related to my program
META-INF
manifest.mf
Resources
all my programs resources
txt
more resources
META-INF
MANIFEST.MF
.version
OneJar.class该项目使用Netbeans and OneJar进行编译,将所有所需的库(在本例中为iText)放在同一个jar文件中,以帮助用户-只有一个文件比两个文件更容易。
jar文件根目录下的META-INF文件夹中的MANIFEST.MF文件包含以下内容:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: One-Jar 0.97 Ant taskdef
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: my.package.MainClass
Class-Path: lib/itextpdf-5.3.3.jar请注意,这是由OneJar自动生成的,所以我认为它是正确的,但如果路径与根相关,则指向主类的实际路径也包含/main/main.jar/。
内部jar文件(实际程序)中的MANIFEST.MF为空。binlib文件夹中的文件夹包含以下内容:
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Main-Class: my.package.MainClass如何让jar运行?
发布于 2012-10-14 19:47:07
jar文件不能在没有JDK的情况下运行,因为Windows不能正确调用java.exe (或javaw.exe)。当用户选择默认程序打开jar文件时,Windows会在注册表中添加以下内容:
"Path\To\JRE\Bin\java(w).exe" "%1"正如您在引号中看到的,缺少-jar标志。当您安装JDK时,它将自动更正这些值。
要解决此问题,您需要一个批处理脚本来替换错误的值。需要修复的注册表项是jarfile、java.exe和javaw.exe。
我所做的是使用程序部署一个jarfix.bat,其中包含如何正确“安装”该程序的说明。
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" /v "CurrentVersion" 1>nul
if errorlevel 1 goto :error
@FOR /F "tokens=2* " %%A IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" /v "CurrentVersion"') DO @SET JAVAVERSION=%%B
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\%JAVAVERSION%" /v "JavaHome" 1>nul
reg query "HKEY_CURRENT_USER\SOFTWARE\Classes\Applications\java.exe" 1>nul
reg query "HKEY_CURRENT_USER\SOFTWARE\Classes\Applications\javaw.exe" 1>nul
if errorlevel 1 goto :error
@FOR /F "tokens=2* " %%A IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\%JAVAVERSION%" /v "JavaHome"') DO @SET JAVAHOME=%%B
@FOR /F "tokens=2* " %%A IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jarfile\shell\open\command" /v ""') DO @SET JAVACOMMAND=%%B
@FOR /F "tokens=2* " %%A IN ('reg query "HKEY_CURRENT_USER\Software\Classes\Applications\java.exe\shell\open\command" /v ""') DO @SET JAVACOMMAND2=%%B
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jarfile\shell\open\command" /f /v "" /t REG_SZ /d "\"%JAVAHOME%\bin\javaw.exe\" -jar \"%%1\" %%*"
reg add "HKEY_CURRENT_USER\Software\Classes\Applications\java.exe\shell\open\command" /f /v "" /t REG_SZ /d "\"%JAVAHOME%\bin\java.exe\" -jar \"%%1\" %%*"
reg add "HKEY_CURRENT_USER\Software\Classes\Applications\javaw.exe\shell\open\command" /f /v "" /t REG_SZ /d "\"%JAVAHOME%\bin\javaw.exe\" -jar \"%%1\" %%*"该程序将编辑注册表,因此该程序需要管理员权限。为了在程序启动时检查它们,我执行了以下操作
NET SESSION >nul 2>&1
if %errorlevel% == 0 (
echo User successfully detected as an administrator!
) else (
echo User doesn't have administrator privileges!
exit /b 1
)发布于 2012-10-06 17:30:31
Java JAR文件只是一个包含大量二进制类的ZIP文件,您的CPU或操作系统无法理解它。
您可以考虑将JAR文件转换为Windows可执行文件,请看一下:How can I convert my Java program to an .exe file?
发布于 2012-10-06 17:33:55
Jar文件只是压缩数据,而不是可执行文件。您必须使用java命令运行该命令,该命令是一个可执行文件。此命令具有打开jar文件、读取类文件和解释字节码、初始化JVM和运行字节码的智能。因此,如果没有字节码解释器命令(java),jar文件将毫无用处。因此,可以通过两种方式在jar中运行类文件。
1) java -classpath jarfile MainClass
2) java -jar jarfile (如果jar文件的清单文件中提到了它的主类)
https://stackoverflow.com/questions/12758498
复制相似问题