Разбитое расширение подстановки для командной строки 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".