Разбитое расширение подстановки для командной строки Java7 в Windows (7?)
Я наблюдаю странное поведение поведения подстановочных расширений для Java7 в Windows.
На протяжении веков существовала чистая разница между "*" и "*" .
Похоже, это не так актуально для Java7 (по крайней мере, на Windows7).
Я заметил проблему при использовании шаблона класса подстановок.
Несмотря на цитирование шаблона группового класса, он расширяется.
Таким образом, кажется, что больше невозможно передать шаблон в java-приложение.
Таким образом, использование java -cp "somewhere/*"
завершится с ошибкой (как и "somewhere\*"
).
Обходной путь выглядит следующим образом: java -cp "somewhere/*;"
, который препятствует расширению.
Чтобы проверить поведение, я написал небольшой класс Echo.java.
Я обнаружил, что использование java 1.6.0 с котировкой "*" и простой * работает, как и ожидалось,
тогда как на Java7 я всегда получал расширенный шаблон.
До сих пор это наблюдалось на Windows7, не знаю, что происходит на XP.
Проблема возникает, поскольку подстановочные знаки в Windows никогда не расширяются темным возрастом CMD.EXE(как и любая оболочка в UNIX). Вместо этого каждый исполняемый файл должен явно выполнять это с помощью setargv.obj.
Я обнаружил две связанные проблемы, которые, похоже, описывают аналогичную проблему:
Наблюдается ли это кто-то еще?
Или есть некоторые неясные настройки Windows или пакетного файла для управления этим?
Dieter.
Ответы
Ответ 1
Да, я заметил ту же проблему.
-
Он объяснил как "известную проблему" в заметках о выпуске для обновления Java7 4.
-
Вот отчет об ошибке. Исправление будет доставлено в обновлении Java7 8 (текущая версия - обновление 6).
-
Обратите внимание, что обходной путь оболочки не существует, потому что в Windows оболочка не обрабатывает расширение подстановочных знаков. (В то время как в Unixes оболочка выполняет расширение).
Ответ 2
Неправильное решение проблемы с ошибкой /*, но я надеюсь, что для облегчения вашей ситуации вы можете использовать следующий script.
libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use ~> java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi;
Сценарий для Linux может иметь аналогичный для Windows. Если в качестве входных данных в "libDir2Scan4jars" указан правильный каталог; script проверит все банки и создаст строку класса path и экспортирует ее в переменную env "tmpCLASSPATH".