0

我已经成功创建了一个在我的开发计算机上运行良好的 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 和 OneJar进行编译,以在同一个 jar 文件中获取所有必需的库(在本例中为 iText)以帮助用户 - 只有一个文件比两个文件更容易。

jar 文件根目录下的文件夹中的文件包含以下内容MANIFEST.MFMETA-INF

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/该路径是否与根相关。

内部MANIFEST.MFjar 文件(实际程序)中的 为空。文件夹中的一个binlib包含以下内容:

Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Main-Class: my.package.MainClass

如何让 jar 运行?

4

3 回答 3

2

没有 JDK,jar 文件将无法运行,因为 Windows 不能正确调用java.exe(或javaw.exe)。当用户选择默认程序打开jar文件时,Windows会在注册表中添加以下内容:

"Path\To\JRE\Bin\java(w).exe" "%1"

正如您在引用中看到的那样,缺少 -jar 标志。安装 JDK 时,它会自动更正这些值。

要解决此问题,您需要一个批处理脚本来替换错误的值。需要修复的注册表项jarfilejava.exejavaw.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-14T11:47:07.257 回答
1

Java JAR 文件只是一个包含许多二进制类的 ZIP,您的 CPU 或操作系统无法理解。为了运行JAR,你需要能够真正理解和执行 JAR 文件、主类等内容的 Java(JRE 就足够了,JDK 是给开发人员的)。当然这是因为 Java 字节码不是你的 CPU 理解的汇编——这些是 Java VM 理解并翻译成 CPU 语言的指令。

您可能会考虑将您的 JAR 文件转换为 Windows 可执行文件,请查看: 如何将我的 Java 程序转换为 .exe 文件?

于 2012-10-06T09:30:31.197 回答
0

Jar 文件只是压缩数据,它不是可执行文件。java您必须使用可执行的命令来运行它。该命令具有打开 jar 文件、读取类文件和解释字节码、初始化 JVM 和运行字节码的智能。所以没有字节码解释器命令 ( java) ,一个 jar 文件就没用了。因此,您可以通过两种方式在 jar 中运行类文件。

1) java -classpath jarfile MainClass

2) java -jar jarfile (如果 jar 文件的 MANIFEST 文件中提到了它的主类)

于 2012-10-06T09:33:55.237 回答