2009-06-23 11 views

Respuesta

2

Sería bueno si hubiese una implementación nativa de cygwin que utilizara el sistema de archivos cygwin y X-windows para su visualización, lamentablemente no conozco dicha versión. Asumo que es un gran esfuerzo portar OpenJDK también, pero no lo he intentado.

0

Aunque no existe un SDK de Java para cygwin, se puede obtener el JDK de Windows para trabajar si usted está dispuesto a dar cabida a soluciones para diversos problemas:

  • algunos caminos cygwin no se manejan como se esperaba por los programas de java
  • el separador de ruta del archivo es la barra invertida en lugar de recortar
  • el separador de entrada de ruta es un punto y coma en lugar de dos puntos

En mi experiencia, el primer punto es por el problema más grande, aunque los tres están de alguna manera interrelacionados. Los separadores tienden a cuidarse a sí mismos como un efecto secundario de resolver el primer problema.

Los tres problemas se resuelven en gran medida configurando un entorno de desarrollo en el que se pueden representar todas las rutas de archivos de interés (vistas por java.io.File y java.nio.Path, etc.) sin especificar una letra de unidad .

Como resulta, rara vez es necesario utilizar barras diagonales inversas en una cadena de ruta de archivo debajo de Windows. Las únicas excepciones a esta regla que he encontrado son al pasar cadenas de ruta de archivo como parámetros al generar una línea de comando para un programa que requiere barras invertidas (por ejemplo, CMD.EXE). Los paquetes java.io y java.nio aceptan todas las barras diagonales, y por lo tanto, para el caso, las bibliotecas de desarrollo de Microsoft. La mayoría de los programas que rechazan un camino con barras inclinadas son (en mi humilde opinión) probablemente lo hagan de manera gratuita.

Entonces, el problema real es que "/ cygdrive/c" no es reconocido por java.io.File como refiriéndose a "C: \".

En otras palabras, la siguiente prueba del archivo volverá falsa:

new java.io.File("/cygdrive/c").exists() 

mientras que esto funciona como se esperaba:

new java.io.File("c:/").exists() 

versiones recientes de Windows ahora son compatibles con los enlaces simbólicos generales, proporcionando una manera de configurar un entorno de desarrollo cygwin en el que no se utilizan letras de unidad. Con una vista unificada del sistema de archivos completo (con todos los archivos que aparecen debajo de "/", la letra predeterminada de la unidad es invariante, por ejemplo, C :), la letra de la unidad puede descartarse de las cadenas de ruta del archivo. En otras palabras, desea poder referirse a "c: /" como "/". Esto se puede lograr de varias maneras, una de ellas enlazar simbólicamente otras unidades por debajo de c: /, por ejemplo:

$ ln -sFT d:/ c:/d 

Si la variable env CYGWIN contiene "winsymlinks: nativo", esto creará un enlace simbólico de Windows, con el resultado que (c asumiendo: es la unidad por defecto) el programa java reconocerá correctamente la cadena "/ d" se refiere a "D: \", por lo que se puede hacer esto:

new java.io.File("/d").isDirectory // returns true, as expected 

Si no puede o reacios para modificar su entorno cygwin, hay otro enfoque, que es más universal. Puede extender java.io.Archivar y anular constructores y varios métodos para (en efecto) traducir las rutas de cygwin a sus equivalentes de Windows (como cygpath -m o -w), y para traducir las cadenas de ruta de Windows a un formato más parecido a POSIX. Tengo una biblioteca así (escrita en scala, pero utilizable de Java) y tengo la intención de ponerla a disposición, espero que pronto.