首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用-jar标志运行.jar

使用-jar标志运行.jar
EN

Stack Overflow用户
提问于 2012-10-06 17:27:11
回答 3查看 2.7K关注 0票数 0

我已经成功地创建了一个Java程序,它可以在我的开发计算机上正常运行,无论是在Netbeans中还是在.jar文件中(双击)。问题是它不会在没有JDK的计算机上启动,也不会在没有java -jar jarfile.jar的命令行中启动(注意,如果没有-jar标志,它就不会启动)。

在开发计算机上,如果命令行上没有-jar标志,则jar文件也不会运行。

在程序无法启动的所有情况下,我得到的错误如下所示。

代码语言:javascript
复制
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的文件结构如下所示:

代码语言:javascript
复制
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文件包含以下内容:

代码语言:javascript
复制
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文件夹中的文件夹包含以下内容:

代码语言:javascript
复制
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Main-Class: my.package.MainClass

如何让jar运行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-14 19:47:07

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

代码语言:javascript
复制
"Path\To\JRE\Bin\java(w).exe" "%1"

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

要解决此问题,您需要一个批处理脚本来替换错误的值。需要修复的注册表项是jarfilejava.exejavaw.exe

我所做的是使用程序部署一个jarfix.bat,其中包含如何正确“安装”该程序的说明。

代码语言:javascript
复制
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\" %%*"

该程序将编辑注册表,因此该程序需要管理员权限。为了在程序启动时检查它们,我执行了以下操作

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-10-06 17:30:31

Java JAR文件只是一个包含大量二进制类的ZIP文件,您的CPU或操作系统无法理解它。

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-06 17:33:55

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

1) java -classpath jarfile MainClass

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12758498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档