0

Netbeansと.jarファイル(ダブルクリック)の両方で、開発用コンピューターで正常に実行されるJavaプログラムを正常に作成しました。問題は、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を使用してコンパイルされ、必要なすべてのライブラリ(この場合はiText)を同じjarファイルに入れて、ユーザーを支援します。2つのファイルよりも1つのファイルだけの方が簡単です。

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/、パスがルートに関連している場合も含まれますが、正しいと思います。

MANIFEST.MF内部jarファイル(実際のプログラム)のは空です。binlibフォルダ内の1つには、次のものが含まれています。

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

jarを実行するにはどうすればよいですか?

4

3 に答える 3

2

Windowsが正しく呼び出さないjava.exe(または)ため、jarファイルはJDKなしでは実行されません。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-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ファイルは役に立ちません。したがって、2つの方法でjar内のクラスファイルを実行します。

1)java -classpath jarfile MainClass

2)java -jar jarfile(jarファイルのMANIFESTファイルにメインクラスが記載されている場合)

于 2012-10-06T09:33:55.237 に答える