Подтвердить что ты не робот

Как установить длинный путь Java classpath в Windows?

Я пытаюсь запустить конкретный тест JUnit вручную в командной строке Windows XP, в котором есть необычно большое количество элементов в пути к классу. Я пробовал несколько вариантов, например:

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\java.exe -client oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(Другие варианты устанавливают путь к классу в одной строке, устанавливая путь к классу через -classpath как аргумент java "). Всегда приходит к консоли, поднимая руки с этой ошибкой:

The input line is too long.
The syntax of the command is incorrect.

Это тест JUnit, тестирующий довольно большой существующий унаследованный проект, поэтому никаких предложений о перераспределении моей структуры каталогов на что-то более разумное, эти типы решений пока отсутствуют. Я просто пытался развернуть быстрый тест против этого проекта и запустить его в командной строке, а консоль обгоняет меня. Помогите!

4b9b3361

Ответ 1

Командная строка Windows очень ограничена в этом отношении. Обходной путь заключается в создании "дорожной банки". Это банка, содержащая только файл Manifest.mf, чья Class-Path указывает пути диска вашего длинного списка банок и т.д. Теперь просто добавьте этот путь к вашему пути к командной строке. Это обычно более удобно, чем упаковка фактических ресурсов вместе.

Как я помню, пути к диску могут относиться к самому банку пути. Таким образом, Manifest.mf может выглядеть примерно так:

Class-Path: this.jar that.jar ../lib/other.jar

Если ваш пусковой баннер содержит в основном базовые ресурсы, то он не будет меняться слишком часто, но вы, вероятно, все же захотите его сгенерировать в своей сборке. Например:

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>

Ответ 2

Начиная с Java 6 вы можете использовать подстановочные знаки classpath.

Пример: foo/*, ссылается на все файлы .jar в каталоге foo

  • это не будет соответствовать файлам класса (только файлы jar). Для совпадения используйте: foo;foo/* или foo/*;foo. Порядок определяет, что загружается первым.
  • Поиск НЕ рекурсивен

Ответ 3

(Я полагаю, вы действительно не имеете в виду DOS, но обратитесь к cmd.exe.)

Я думаю, что это ограничение CLASSPATH меньше, чем ограничение размера среды/среды. В XP отдельные переменные среды могут быть размером 8k, вся среда ограничена 64k. Я не вижу, что вы попадете в этот предел.

Существует ограничение на окна, ограничивающее длину командной строки, на WindowsNT + это 8k для cmd.exe. Эта команда ограничена. Может быть, у вас есть более чем 8 тысяч каталогов в вашей команде? Возможно, вам не повезло, тогда даже если вы разделите их на Ник Берарди.

Ответ 4

Если бы я был на твоем месте, я бы загрузил утилиту соединения из MS: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx, а затем нарисовал карту "C:\path", чтобы сказать "z: \" и "c:\path2", чтобы сказать "y: \". Таким образом, вы уменьшите 4 символа на элемент в classpath.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

Теперь ваш путь к классу будет:

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

Это может сделать больше в зависимости от вашего фактического classpath.

Ответ 5

Я думаю, что ты за рулем без весла здесь. Командная строка имеет предел для аргументов для вызова программы.

У меня есть 2 sugestion, которые вы могли бы попробовать. Во-первых, перед запуском тестов junit вы можете позволить script/ant_task создавать JAR-классы различных классов в пути к классам. Затем вы можете поместить JAR в путь класса, который должен быть короче.

Другой способ, которым вы могли бы попробовать, - создать антскрипт для запуска JUNIT, в ANT не должно быть такого предела для записей pathpath.

Ответ 6

Как упоминает HuibertGill, я бы обернул это в конструкцию Ant build script, чтобы вам не пришлось самостоятельно управлять всем этим.

Ответ 7

Вы можете попробовать это


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

перейдите в командную строку и запустите ее дважды (не знаю, почему.... я должен делать это на машине с Windows XP) также пути r, установленные только для текущего сеанса командной строки

Ответ 8

Не было никакого решения проблемы, кроме как-то сделать путь к классу короче, переместив файлы jar в папку типа "C:\jars".

Ответ 9

Используйте "Файл аргумента" на Java 9+

В Java 9+ исполняемый файл Java поддерживает предоставление аргументов через файл. См. Https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111.

Этот механизм явно предназначен для решения проблемы ограничений ОС на длину команд:

Вы можете сократить или упростить команду java, используя файлы @argument, чтобы указать текстовый файл, содержащий аргументы, такие как параметры и имена классов, передаваемые команде java. Это позволяет вам создавать команды Java любой длины в любой операционной системе.

В командной строке используйте префикс at (@) для определения файла аргумента, который содержит параметры java и имена классов. Когда команда java встречает файл, начинающийся со знака at (@), она расширяет содержимое этого файла в список аргументов так же, как они будут указаны в командной строке.

Это "правильное" решение, если вы используете версию 9 или выше. Этот механизм просто изменяет способ предоставления аргумента JVM и поэтому на 100% совместим с любой платформой или приложением, независимо от того, как они выполняют загрузку классов, т.е. он полностью эквивалентен простому предоставлению аргумента в командной строке, как обычно. Это не относится к манифестам на основе манифеста к этому ограничению ОС.

Пример этого:

Исходная команда:

java -cp c:\foo\bar.jar;c:\foo\baz.jar

можно переписать как:

java @c:\path\to\cparg

где c:\path\to\cparg - это файл, который содержит:

-cp c:\foo\bar.jar;c:\foo\baz.jar

Этот "файл аргументов" также поддерживает символы продолжения строки и кавычки для правильной обработки пробелов в путях, например

-cp "\
c:\foo\bar.jar;\
c:\foo\baz.jar"

Gradle

Если вы столкнулись с этой проблемой в Gradle, посмотрите этот плагин, который автоматически преобразует ваш путь к классам в "файл аргументов" и предоставляет его JVM при выполнении exec или тестовых задач в Windows. В Linux или других операционных системах по умолчанию ничего не происходит, хотя можно использовать дополнительное значение конфигурации для применения преобразования независимо от ОС.

https://github.com/redocksoft/classpath-to-file-gradle-plugin

(отказ от ответственности: я автор)

Смотрите также эту связанную проблему Gradle - надеюсь, эта возможность в конечном итоге будет интегрирована в ядро Gradle: https://github.com/gradle/gradle/issues/1989.

Ответ 10

Вы пытались уложить их?

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%