2008-10-14 7 views
32

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

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 тестирования довольно большой существующий унаследованный проект, так что никаких предложений о перестраивая свою структуру каталогов на что-то более разумным, эти типы решений находятся вне сейчас. Я просто пытался развернуть быстрый тест против этого проекта и запустить его в командной строке, а консоль обгоняет меня. LP!

ответ

47

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

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

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

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

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

Задача ManifestClassPath, доступная в Ant начиная с версии 1.7, может быть использована для создания подходящего свойства для атрибута Class-Path из Ant Path. – 2012-03-21 19:53:54

+1

Нужно ли что-либо делать, например, обеспечить загрузку этой банки? Или будет ли JVM проверять все банки на пути класса для таких манифестаций? Кроме того, он переносится через JVM? Какая минимальная версия Java поддерживает это? – bacar 2014-09-30 13:26:08

+0

Я пробовал это, но Manifest.mf ** допускает только относительные URL ** для других JAR и каталогов. – xamde 2018-01-22 17:58:29

-2

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

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% 
+2

Мы попробовали пару вариантов этого, но безрезультатно. CMD, кажется, заменяет все эти% ALT_A% и т. Д. «На лету», и последний путь заканчивается слишком длинным для его обработки, что дает мне ту же ошибку. – 2008-10-14 18:04:40

0

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

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

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

4

(я полагаю, вы на самом деле не означает, DOS, но относятся к cmd.exe.)

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

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

+0

Вордс, да, старая школа просачивается. Да, cmd.exe. – 2008-10-14 18:08:09

17

С Java 6 вы можете использовать classpath wildcards.

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

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

Это кажется новым в Java 6. – 2008-10-14 17:20:04

0

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

1

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

0

Вы могли бы попробовать это


@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%;" 

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

0

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