Переменные среды Java установлены правильно, но java не находит банки

Резюме

Переменные среды Java установлены правильно, как видно из их повторения. Однако jar-файлы видны только в том случае, если они явно включены в команду javac.

Подробности

Это не относится конкретно к графике и OpenGl, определенно проблема связана с путями к классам, то есть импортом сторонних файлов jar.

Используется Windows XP SP3, JDK 1.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; в частности, он импортирует "javax.media.opengl.GL2".

JarDir.java - это программа, которую я нашел по адресу http://www.java2s.com/Code/Java/File-Input-Output/Listfilesinajarfile.htm, который показывает, какие классы находятся в банке, я использую его для проверки содержимого банки. Это также демонстрирует, что компиляция возможна на машине.

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

Что выдавало ошибки из-за отсутствия связанных классов (таких как MushScene.java, который создается Mush.java и находится в той же папке проекта ...) НО проблем с поиском javax.media.opengl нет! Значит, проблема должна быть в переменной окружения!

Тогда это означает, что, хотя согласно echo% classpath% путь к классам установлен правильно, java не соглашается. Что я сделал не так?

Примечание: программа Mush.java демонстративно работала в Linux.

Примечание 2: у меня есть несколько банок, если я в конечном итоге использую N банок в папке jar, я хотел бы иметь возможность включить папку, а не называть каждую банку отдельно =)


person xxjjnn    schedule 02.02.2013    source источник
comment
почему бы вам не добавить полный путь к jar в classpath C:\Documents and Settings\Administrator\My Documents\project\jar\jogl-all.jar. Проверить полный путь   -  person Subin Sebastian    schedule 02.02.2013
comment
видите, что когда вы делаете >javac Mush.java -cp ./jar/jogl-all.jar, вы указываете полный путь   -  person Subin Sebastian    schedule 02.02.2013
comment
Спасибо Дж.Б. Низету и Субину. Хотя папка jar находится в пути к классам, содержимое jar-файлов нет, как и jar-файлы, сами по себе являются папками. Тогда возникает вопрос: как нам рекурсивно добавить папку, чтобы все подпапки (и содержимое jar) добавлялись в путь к классам (где программа будет искать)? Это отдельный вопрос, и его уже задавали здесь: stackoverflow.com/questions/402330/   -  person xxjjnn    schedule 02.02.2013


Ответы (3)


jogl-all.jar отсутствует в вашей переменной среды CLASSPATH. Очевидно, javac не сможет найти какой-либо класс в этой банке, если вы явно не включите его в параметр -cp. Сама банка должна находиться в CLASSPATH, а не в каталоге, содержащем ее. точно так же, как в варианте -cp.

В любом случае я бы не стал использовать глобальную переменную среды CLASSPATH, а только параметр -cp. Это упростит вам задачу, когда вы скомпилируете или запустите другой Java-проект с другими зависимостями.

person JB Nizet    schedule 02.02.2013
comment
Что делать, если у меня несколько банок? Кроме того, когда я использую параметр -cp, он больше не видит другие файлы в папке проекта ... - person xxjjnn; 02.02.2013
comment
установка CLASSPATH или передача пути к классам с параметром -cp не изменяет то, что должно быть в пути к классам. Если у вас несколько jar-файлов, вам нужно включить их все в путь к классам, какой бы вариант вы ни выбрали. Банки должны быть разделены : в * nix и ; в Windows: -cp c: \ path \ to \ first.jar; c: \ path \ to \ second.jar. Путь к классам должен содержать файл jar вашего проекта или каталог классов И все файлы jar, на которые опирается ваш код. - person JB Nizet; 02.02.2013

Решение для этого с переменными окружения. (Предупреждение - это может быть не лучшая практика, см. Принятый ответ)

Переменная среды пути к классам:

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 \ *" в переменной пути к классам. Это добавит все банки в эту папку.

Что касается переменной пути, а также папки bin вашего sdk, вам также понадобится папка lib вашего sdk И любые папки lib, которые ваши jar-файлы ожидают использовать.

Затем вы можете javac Mush.java и java Mush и смотреть, как все работает идеально =)

person xxjjnn    schedule 02.02.2013

Будьте осторожны, не используйте точки с запятой в переменной JAVA_HOME, так как это испортит все удобные пути, например: %JAVA_HOME%\bin. Как вы написали выше, это приведет к: C:\Java\jdk1.7.0_13;\bin, что явно неверно.

person not2qubit    schedule 25.02.2014