2

概要

エコーからわかるように、Java環境変数は正しく設定されています。ただし、jarは、javacコマンドに明示的に含まれている場合にのみ表示されます。

詳細

これは特にグラフィックスやOpenGlとは関係ありません。特定の問題はクラスパス、つまりサードパーティのjarファイルのインポートに関係しています。

Windows XP SP3、JDK1.7.0_13を使用する

Windows XPでは、システム環境変数PATH / JAVA_HOME / CLASSPATHが設定/追加され、次のディレクトリが含まれるようになりました。

C:\Documents and Settings\Administrator\My Documents\project\jar;
C:\Java\jdk1.7.0_13;
C:\Java\jdk1.7.0_13\bin;
C:\Java\jdk1.7.0_13\lib;

競合する可能性のあるユーザー定義変数はありません。ターミナルからの保証(更新されるように環境変数を変更した後、Windows XPで環境変数を設定するために再起動しました。Javaインストールの環境変数を参照してください):

>echo %classpath%
  C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;

>echo %java_home%
  C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;

>echo %path%
  C:\WINDOWS\System32;... ...C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;C:\Documents and Settings\Administrator\My Documents\project\jar;

やり過ぎ、はい...それが機能するとき、私はそれらを適切にトリミングします

関連ファイル:

C:\Documents and Settings\Administrator\My Documents\project\jar\jogl-all.jar
C:\Documents and Settings\Administrator\My Documents\project\Mush.java

C:\Documents and Settings\Administrator\My Documents\project\JarDir.java

jogl-all.jarには「javax.media.opengl.GL2」が含まれています。Mush.javaは、java-OpenGLライブラリをインポートして単純な3Dキノコを表示するプログラムです。具体的には、「javax.media.opengl.GL2」をインポートします。

JarDir.javaは、 http: //www.java2s.com/Code/Java/File-Input-Output/Listfilesinajarfile.htmで見つけたプログラムで、jar内のクラスを示しています。これを使用して、jarの内容を証明しています。 。また、マシン上でコンパイルが可能であることも示しています。

JarDir.javaは次のとおりです。

import java.io.*;
   import java.util.*;
   import java.util.jar.*;

   public class JarDir {
     public static void main (String args[]) 
         throws IOException {

       JarFile jarFile = new JarFile("C:\\Documents and Settings\\Administrator\\My Documents\\project\\jar\\jogl-all.jar");
       Enumeration enumy = jarFile.entries();
       while (enumy.hasMoreElements()) {
         process(enumy.nextElement());
       }
     }

     private static void process(Object obj) {
       JarEntry entry = (JarEntry)obj;
       String name = entry.getName();
       long size = entry.getSize();
       long compressedSize = entry.getCompressedSize();
       System.out.println(
           name + "\t" + size + "\t" + compressedSize);
     }
   }

そして出力を与えます:

>javac JarDir.java

>java JarDir
... (lots of stuff)
javax/media/opengl/GL2.class   94123   28513
... (lots of stuff)

これは、コンパイルが成功し、jarファイル内にクラスが存在することを示しています。Mush.javaを実行しようとすると、多くのエラーが発生します。かなり最初のエラーです。

>javac Mush.java
Mush.java:21: error: package javax.media.opengl does not exist:
import javax.media.opengl.GL2;
                         ^

これがクラスパスの問題であるかどうかを判断するために、次のコマンドを実行しました。

>javac Mush.java -cp ./jar/jogl-all.jar

関連するクラス( Mush.javaによってインスタンス化されて同じプロジェクトフォルダーにあるMushScene.javaなど)が存在しないことに基づいてエラーが発生しましたが、javax.media.openglを見つけるのに問題はありませ!したがって、問題は環境変数の問題である必要があります。

つまり、echo%classpath%によると、クラスパスは正しく設定されていますが、javaは同意しません。私は何を間違えましたか?

注:Mush.javaプログラムは、Linuxで実証的に機能しています。

注2:複数のjarがあり、jarフォルダー内でN個のjarを使用することになった場合、各jarに具体的に名前を付けるのではなく、フォルダーを含めることができるようにしたいと思います=)

4

3 に答える 3

4

jogl-all.jar が CLASSPATH 環境変数にありません。したがって、オプションjavacに明示的に含めないと、明らかに、この jar からクラスを見つけることができません。-cpjar 自体は、それを含むディレクトリではなく、CLASSPATH にある必要があります。-cpオプションのように。

とにかく、グローバル CLASSPATH 環境変数は使用しませんが、オプションのみを使用し-cpます。異なる依存関係を持つ別の Java プロジェクトをコンパイルまたは実行するときに、すべてが簡単になります。

于 2013-02-02T11:53:28.367 に答える
1

環境変数でそれを行うためのソリューション。(警告 - ベスト プラクティスではない可能性があります。受け入れられた回答を参照してください)

クラスパス環境変数:

C:\Documents and Settings\Administrator\My Documents\project\jar\*;

パス環境変数:

...;C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;C:\Documents and Settings\Administrator\My Documents\project\lib;

jar フォルダーの追加は間違っていることに注意してください。クラスパス変数にバックスラッシュとスター「 jar\* 」が必要です。これにより、そのフォルダーにすべての jar が追加されます。

パス変数については、sdk の bin フォルダーと同様に、sdk の lib フォルダーと、jar が使用する予定の lib フォルダーも必要です。

次に、Mush.javaJava Mushを javac して、すべてが完全に機能するのを確認できます =)

于 2013-02-02T17:34:37.653 に答える