Хотя для Cygwin не существует java sdk, вы можете заставить работать Windows jdk, если вы готовы использовать обходные пути для различных проблем:
- некоторые пути cygwin обрабатываются не так, как ожидается Java-программами
- разделитель пути к файлу - это косая черта вместо косой черты
- разделитель записи PATH - точка с запятой вместо двоеточия
По моему опыту, первая пуля - безусловно самая большая проблема, хотя эти три в некоторой степени взаимосвязаны. Сепараторы, как правило, заботятся о себе как побочный эффект решения первой проблемы.
Все три проблемы в значительной степени решаются путем настройки среды разработки, в которой все представляющие интерес пути к файлам (с точки зрения java.io.File, java.nio.Path и т. Д.) Могут быть представлены без указания буквы диска.
Как оказалось, редко нужно использовать обратную косую черту в строке пути к файлу под Windows. Единственные исключения из этого правила, с которыми я столкнулся, - это когда в качестве параметров передаются строки пути к файлу при порождении командной строки для программы, требующей обратной косой черты (например, CMD.EXE). Все пакеты java.io и java.nio допускают прямую косую черту, как и библиотеки разработки Microsoft. Большинство программ, которые отклоняют путь с косой чертой (IMHO), вероятно, делают это безвозмездно.
Итак, реальная проблема в том, что "/ cygdrive / c" не распознается java.io.File как ссылающийся на "C: \".
Другими словами, следующий тест файла вернет false:
new java.io.File("/cygdrive/c").exists()
тогда как это работает, как и ожидалось:
new java.io.File("c:/").exists()
Последние версии Windows теперь поддерживают общие символические ссылки, предоставляя способ настройки среды разработки Cygwin, в которой буквы дисков не используются. При едином представлении всей файловой системы (все файлы отображаются ниже «/», буква диска по умолчанию неизменна, например, C :), буква диска может быть удалена из строк пути к файлу. Другими словами, вы хотите иметь возможность ссылаться на «c: /» как «/». Это может быть выполнено различными способами, один из которых заключается в символической привязке других дисков ниже c: /, например:
$ ln -sFT d:/ c:/d
Если переменная env CYGWIN содержит «winsymlinks: native», это создаст символическую ссылку Windows, в результате (если предположить, что c: диск по умолчанию) ваша Java-программа будет правильно распознавать строку «/ d» как ссылку на « D: \ ", так что вы можете сделать это:
new java.io.File("/d").isDirectory // returns true, as expected
Если вы не можете или не хотите изменять свою среду cygwin, существует другой подход, который является более универсальным. Вы можете расширить java.io.File и переопределить конструкторы и различные методы для (по сути) преобразования путей cygwin в их эквивалент Windows (например, cygpath -m или -w), а также для перевода строк пути Windows в более POSIX-подобный формат. , У меня есть такая библиотека (написанная на Scala, но используемая из Java), и я собираюсь сделать ее доступной, надеюсь, скоро.