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

34

9 ответы

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

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

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

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


  
    
  

49
добавлено
Нужно ли мне что-либо делать, например, обеспечить загрузку этой банки? Или будет ли JVM проверять все банки на пути класса для таких манифестаций? Кроме того, он переносится через JVM? Какая минимальная версия Java поддерживает это?
добавлено автор bacar, источник
Задача ManifestClassPath, доступная в Ant начиная с версии 1.7, может быть использована для создания подходящего свойства для атрибута Class-Path из пути Ant.
добавлено автор Matt Hurne, источник
Я пробовал это, но Manifest.mf допускает только относительные URL для других JAR и каталогов.
добавлено автор xamde, источник
18
добавлено
Это похоже на «Link Only Answer». Вы должны предоставить более подробную информацию о том, как это сделать.
добавлено автор rghome, источник
Эй, это круто - я об этом не знал. Это определенно полезный вариант, особенно если (как в нашем случае), classpath заполнен баночками, многие из которых находятся в одном каталоге.
добавлено автор Ogre Psalm33, источник
Это кажется новым в Java 6.
добавлено автор Chris Noe, источник
Но это не обеспечивает рекурсивное пересечение.
добавлено автор Snehal Masne, источник

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

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

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

4
добавлено
Шум, да, старая школа просачивается. Да, cmd.exe.
добавлено автор Ogre Psalm33, источник

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

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% и т. Д. «На лету», и последний путь заканчивается слишком длинным для его обработки, что дает мне ту же ошибку.
добавлено автор Ogre Psalm33, источник

If I were in your shoes, I would download the junction utility from MS : http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx and then map your "C:\path" to say, "z:\" and "c:\path2" to say, "y:\". This way, you will be reducing 4 characters per item in your 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;

Now, your classpath will be :

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 .

1
добавлено
Junction является одним интерфейсом для NTFS. mklink/D - еще один, возможно, уже присутствует в более поздних версиях Windows.
добавлено автор mgaert, источник
mlink, похоже, не входит в Windows 7. Соединение включено как часть Windows 7 (предприятие).
добавлено автор anjanb, источник

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

0
добавлено

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

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

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

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

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

0
добавлено

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

0
добавлено
Неправильно. Там было другое решение, но вы либо не знали, что это было, либо решили не использовать его. Однако то, что вы сделали, было определенно решением ... которое может работать в некоторых обстоятельствах.
добавлено автор Stephen C, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async