¿Cómo funcionan para forzar al compilador de Java solamente la compilación del archivo de origen especifico?

deltamind106:

El compilador de Java 12.0.1 (mis pruebas aquí son todos corren en MS Windows) tiene un comportamiento muy extraño cuando se utiliza el argumento -sourcepath, con respecto a lo que se decida a compilar. La manera más fácil de explicar esto es proporcionar dos ejemplos y citar las diferencias en el comportamiento.

Ejemplo 1:

archivo de origen "A.java"

public class A {
    public static void main(String[] args) {
        System.out.println("Hello World");
        B.myMethod();
    }
}

archivo de origen "B.java"

public class B {
    public static void myMethod() {
        System.out.println("Goodbye!");
    }
}

Para compilar el ejemplo 1, sólo tiene que utilizar la siguiente:

javac -sourcepath . A.java

Esto compilará tanto A.java y B.java y crear A.class y B.class. Esperamos también para compilar B.java debido a que A depende de ello. Ahora espera un segundo o así, y sin modificar ".java" archivo de origen, basta con volver a ejecutar el comando de compilación anteriormente. Usted encontrará que se re-compila A.java y se crea un nuevo A.class (con marca de tiempo actualizada), pero B.class no es re-compilado. Ok, esto es más o menos lo que cabría esperar. Ahora vamos a comparar esto con el siguiente ejemplo a continuación.

Ejemplo 2:

archivo de origen "example2 / A.java"

package example2;
public class A {
    public static void main(String[] args) {
        System.out.println("Hello World");
        B.myMethod();
    }
}

archivo de origen "example2 / B.java"

package example2;
public class B {
    public static void myMethod() {
        System.out.println("Goodbye!");
    }
}

Los archivos fuente son los mismos, excepto que todo se mueve dentro de un paquete. Queremos recopilar los dos archivos de origen, mientras que actualmente en la carpeta "example2". Por eso, utilizamos el siguiente comando:

javac -sourcepath .. A.java

Esto volverá a compilar tanto A.java y B.java y crear A.class y B.class. No tuvimos problemas aquí, igual que antes. Tenga en cuenta que -sourcepath es ahora ".." porque esa es la carpeta de origen 'raíz' ahora que todo está en un paquete. Ahora esperar un segundo más o menos y sin modificar ninguno de los archivos fuente, sólo tiene que volver a ejecutar el comando de compilación anteriormente. Usted encontrará que tanto A.java y B.java y un nuevo archivo A.class y B.class se creó (con marcas de tiempo actualizados) que compila-re.

Tenga en cuenta la diferencia en el comportamiento de compilación cuando el comando javac se ejecuta la segunda vez. Cuando -sourcefile era "" y los archivos no estaban en un paquete, el segundo comando "javac" solo compila el archivo fuente especificado en la línea de comandos. Pero cuando -sourcefile es ".." y las clases se encuentran en un paquete, el segundo comando 'javac' compila SIEMPRE todos los archivos de origen dependientes, sin importar si los archivos de origen no especificados deben volver a compilar o no.

La pregunta es ¿por qué? Qué argumentos puedo pasar a la línea de comandos javac al ejemplo 2 parada de recompilar sin condiciones a todos los archivos de origen dependientes, si sus archivos de clase tienen una marca de tiempo más recientes que los archivos de origen?

Klitos Kyriacou:

Este problema se produce porque javac compara las marcas de tiempo entre el archivo .java y el archivo .class. Se utiliza -sourcepathpara encontrar los archivos de origen, y -classpathpara encontrar los archivos de clase. Por lo tanto, el problema se puede solucionar mediante la especificación de la ruta de clase:

javac -sourcepath .. -classpath .. A.java

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=214003&siteId=1
Recomendado
Clasificación