.jar使用-jar标志运行

时间:2012-10-06 09:27:11

标签: java jar noclassdeffounderror

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

jar文件根目录中MANIFEST.MF文件夹中的META-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/

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

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

如何让jar运行?

3 个答案:

答案 0 :(得分:1)

Java JAR文件只是一个包含大量二进制类的ZIP,您的CPU或操作系统无法理解。为了运行 JAR,您需要Java(JRE就足够了,JDK适用于开发人员),它们可以实际理解和执行JAR文件,主类等的内容。当然这是因为Java字节码不是您的CPU理解的程序集 - 这些是Java VM理解并转换为CPU语言的指令。

您可以考虑将JAR文件转换为Windows可执行文件,请查看:How can I convert my Java program to an .exe file?

答案 1 :(得分:1)

如果没有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
)

答案 2 :(得分:0)

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

  

1)java -classpath jarfile MainClass

     

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