2012-06-01 6 views
5

Digamos que tengo dos clases (Bob y Tom) tales que Bob usa a Tom, pero Tom no requiere a Bob. Ambos archivos están ubicados en la misma estructura de directorios.¿Cómo evito la compilación implícita de Java cuando la clase existe en el classpath?

public class Bob { 
    public static void main(String[] args) { 
    System.out.println(Tom.MESSAGE); 
    } 
} 

public class Tom { 
    public static String MESSAGE = "Hello World"; 
} 

Si intento para compilar Bob en la manera típica, puedo conseguirlo para compilar implícitamente Tom.java así ya que se reconoce como una dependencia del Bob.java. Eso funciona genial

Pero ahora digamos que quiero ubicar a Tom en un archivo JAR. Entonces construyo Tom.java y coloco los resultados en un archivo JAR: libTom.jar. Ahora compilo con classpath apuntando al libTom.jar. Desafortunadamente, el compilador ve el archivo Tom.java y hace que se compile en lugar de usar la clase en libTom.jar. ¿Hay alguna manera de hacer que el compilador omita la construcción implícita de Tom.java si la clase se encuentra en el classpath?

Reconozco que este ejemplo es bastante artificial. Tenga la seguridad de que hay un caso de uso más complicado y menos artificial que rodea este problema. Gracias.

+3

Aunque no lo he usado, ¿has probado el indicador "-implicit" para javac? de acuerdo con el resultado de la ayuda: "-implicit: {none, class} Especifica si se generan o no archivos de clase para los archivos de referencia implícita", que suena como lo que quieres. –

+0

¿por qué no es esa una respuesta? @SteveB. – 11684

Respuesta

0

Parece que esto simplemente no es posible, que es lo que temía desde el principio.

0

Sí, se puede hacer escribiendo el nombre completo de una clase, es decir Typing

System.out.println (the.package.of.external.Tom.MESSAGE);
System.out.println (the.current.package.Tom.MESSAGE);

+0

Lo siento, es posible que no haya tenido claridad sobre este elemento. Las clases 'Tom' en cuestión son exactamente la misma clase. Entonces el paquete sería el mismo paquete. Solo quiero evitar la compilación implícita cuando no sea necesaria una compilación debido a que la clase ya se ha compilado. –

+0

aha ... Podría colocar el podría colocar el código fuente en otro directorio e 'importar' la clase. – 11684

+0

o puede echarle un vistazo a JRebel. @ViperBailey – 11684

1

Si hay dos clases con el mismo nombre y en el mismo paquete en el classpath, es difícil predecir cuál será recogido cuando Java compile el código. En el caso de que la clase Tom exista en la fuente misma, seguramente será recogido.

Una forma de evitarlo es colocar uno de los Tom en un paquete diferente. Otra forma es si puede mover su actual Tom a un proyecto separado. Entiendo que cualquiera de estos puede no ser práctico para usted. Si es realmente necesario, puede experimentar escribiendo su propio ClassLoader. Consulte esta pregunta como referencia: Jar hell: how to use a classloader to replace one jar library version with another at runtime

0

¿Puede dividir los archivos java en directorios de origen independientes? Esto tendría sentido ya que podría construir su jar a partir del contenido de un directorio de origen, luego simplemente incluir el otro directorio de origen cuando compila todos los otros conjuntos de archivos. Esto funciona bien en Eclipse. Aún mejor sería usar dos proyectos en Eclipse.

+0

Debido a la naturaleza del problema específico que estoy tratando de resolver, eso no funcionaría. –

+0

Puede que tenga que explicar más sobre el problema específico, luego – davidfrancis

Cuestiones relacionadas