Вопрос:

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

java junit classpath

60343 просмотра

11 ответа

10484 Репутация автора

Я пытаюсь запустить определенный тест 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 все в одну строку, установка classpath через -classpath в качестве аргумента для java ".) Это всегда сводится к тому, что консоль поднимает руки с этой ошибкой:

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

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

Автор: Ogre Psalm33 Источник Размещён: 14.10.2008 04:08

Ответы (11)


-2 плюса

45742 Репутация автора

Вы пробовали складывать их?

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%
Автор: Nick Berardi Размещён: 14.10.2008 04:20

0 плюса

693 Репутация автора

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

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

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

Автор: Huibert Gill Размещён: 14.10.2008 04:20

4 плюса

260652 Репутация автора

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

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

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

Автор: Tomalak Размещён: 14.10.2008 04:25

52 плюса

18656 Репутация автора

Решение

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

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

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

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

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>
Автор: Chris Noe Размещён: 14.10.2008 04:52

20 плюса

41878 Репутация автора

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

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

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

0 плюса

110826 Репутация автора

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

Автор: matt b Размещён: 14.10.2008 05:21

1 плюс

7477 Репутация автора

Если бы я был на вашем месте, я бы скачал утилиту соединения от MS: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx и затем сопоставил бы ваш «C: \ путь», чтобы сказать: «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;

Теперь ваш classpath будет:

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.

Автор: anjanb Размещён: 14.10.2008 06:08

0 плюса

9 Репутация автора

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


@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, заданные только для текущего сеанса командной строки

Автор: Shivananda Sahu Размещён: 10.07.2012 03:04

0 плюса

1696 Репутация автора

У этой проблемы не было иного решения, кроме как как-то сократить путь к классам, переместив файлы jar в папку типа «C: \ jars».

Автор: Snehal Masne Размещён: 19.10.2016 10:15

3 плюса

8359 Репутация автора

Используйте «Файл аргумента» на 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 .

Автор: Raman Размещён: 19.01.2019 07:52

0 плюса

804 Репутация автора

Спасибо Раману за представление нового решения проблемы маршрутизации для Java 9+. Я взломал bootRunзадачу, которая позволяет использовать все, что уже было оценено gradle, для запуска java с файлами аргументов. Не очень элегантно, но работает.

// Fix long path problem on Windows by utilizing java Command-Line Argument Files 
// https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 
// The task creates the command-line argument file with classpath
// Then we specify the args parameter with path to command-line argument file and main class
// Then we clear classpath and main parameters
// As arguments are applied after applying classpath and main class last step 
// is done to cheat gradle plugin: we will skip classpath and main and manually
// apply them through args
// Hopefully at some point gradle will do this automatically 
// https://github.com/gradle/gradle/issues/1989 

if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    bootRun {
        doFirst {
            def argumentFilePath = "build/javaArguments.txt"
            def argumentFile = project.file(argumentFilePath)
            def writer = argumentFile.newPrintWriter()
            writer.print('-cp ')
            writer.println(classpath.join(';'))
            writer.close()

            args = ["@${argumentFile.absolutePath}", main]
            classpath = project.files()
            main = ''
        }
    }
}

Автор: user1921819 Размещён: 22.03.2019 01:03
Вопросы из категории :
32x32