2012-06-01 1 views
5

Nehmen wir an, ich habe zwei Klassen (Bob und Tom), so dass Bob Tom benutzt, aber Tom braucht Bob nicht. Beide Dateien befinden sich in derselben Verzeichnisstruktur.Wie verhindere ich die implizite Java-Kompilierung, wenn die Klasse im Klassenpfad existiert?

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

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

Wenn ich versuche, Bob in der typischen Art und Weise zu erstellen, kann ich es implizit Tom.java auch zu kompilieren, da es als eine Abhängigkeit von Bob.java erkannt wird. Das funktioniert großartig.

Aber jetzt sagen wir, dass ich Tom in einer JAR-Datei platzieren möchte. Also baue ich Tom.java und lege die Ergebnisse in eine JAR-Datei: libTom.jar. Ich kompiliere jetzt mit dem Klassenpfad, der auf libTom.jar zeigt. Leider sieht der Compiler die Datei Tom.java und veranlasst, dass sie kompiliert wird, anstatt die Klasse in libTom.jar zu verwenden. Gibt es eine Möglichkeit, den Compiler zu veranlassen, die implizite Konstruktion von Tom.java zu überspringen, wenn die Klasse im Klassenpfad gefunden wird?

Ich erkenne, dass dieses Beispiel ziemlich erfunden ist. Seien Sie versichert, dass es einen komplizierteren, weniger erfundenen Anwendungsfall gibt, der dieses Problem umgibt. Vielen Dank.

+3

Obwohl ich es nicht benutzt habe, hast du das "-implicit" -Flag für javac ausprobiert? Entsprechend der Hilfe-Ausgabe: "-implicit: {none, class} Geben Sie an, ob Sie Klassendateien für implizit referenzierte Dateien generieren möchten oder nicht," die sich anhören, was Sie wollen. –

+0

Warum ist das nicht eine Antwort? @SteveB. – 11684

Antwort

0

Es scheint, dass dies einfach nicht möglich ist, was ich von Anfang an befürchtet habe.

0

Ja, könnten Sie tun, indem Sie den vollständigen Namen einer Klasse eingeben, das heißt Typing

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

+0

Tut mir leid, ich war vielleicht etwas unklar bei diesem Element. Die fraglichen Tom-Klassen sind genau die gleiche Klasse. Also wäre das Paket das gleiche Paket. Ich möchte nur implizite Kompilierung vermeiden, wenn keine Kompilierung notwendig wäre, da die Klasse bereits kompiliert wurde. –

+0

aha ... Sie könnten den Quellcode in ein anderes Verzeichnis platzieren und die Klasse "importieren". – 11684

+0

oder schauen Sie sich JRebel an. @ ViperBailey – 11684

1

Wenn es zwei Klassen mit demselben Namen und demselben Paket im Klassenpfad gibt, ist es schwierig vorherzusagen, welcher Code bei der Kompilierung des Codes durch Java übernommen wird. Falls die Klasse Tom in der Quelle selbst existiert, wird sie sicher abgeholt.

Eine Möglichkeit, die Sie vermeiden können, ist es, eines der Tom s in ein anderes Paket zu legen. Ein anderer Weg ist, wenn Sie Ihre aktuelle Tom in ein separates Projekt verschieben können. Ich verstehe, dass beides möglicherweise für Sie nicht praktikabel ist. Wenn es wirklich notwendig ist, könnten Sie mit dem Schreiben eines eigenen ClassLoader experimentieren. Siehe diese Frage als Referenz: Jar hell: how to use a classloader to replace one jar library version with another at runtime

0

Können Sie die Java-Dateien in separate Quellverzeichnisse teilen? Dies wäre sinnvoll, da Sie Ihr Jar aus dem Inhalt eines Quellverzeichnisses erstellen und dann das andere Quellverzeichnis bei der Kompilierung aller anderen Dateien mit einbeziehen könnten. Dies funktioniert gut in Eclipse. Noch besser wäre es, zwei Projekte in Eclipse zu verwenden.

+0

Aufgrund der Art des spezifischen Problems, das ich versuche zu lösen, würde das nicht funktionieren. –

+0

Sie müssen dann möglicherweise mehr über das spezifische Problem erklären – davidfrancis

Verwandte Themen