Kann ich den Classpath verwenden, um eine Datei in einem Glas zu überschreiben, die ausgeführt werden?

StackOverflow https://stackoverflow.com/questions/1708534

Frage

Ich habe eine JAR-Datei, die eine Anwendung sowie Konfigurationsdateien für diese Anwendung enthält. Die Anwendung lädt Konfigurationsdateien aus dem Classpath (mit ClassLoader.getResource()) und hat seine Abhängigkeiten vollständig erfüllt die Konfigurationsdateien in der JAR-Datei gebrannt.

Gelegentlich möchte ich die Anwendung mit einer etwas anderen Konfiguration ausgeführt werden (insbesondere möchte ich die JDBC-URL außer Kraft zu setzen, um eine andere Datenbank Punkt), damit ich erstellen Sie eine neue Konfigurationsdatei, sollte sie in der richtigen Verzeichnis-Struktur (die bedeutet, in einem Verzeichnis /config einen classpath-Eintrag), und ich möchte etwas tun:

java -cp new-config:. -jar application.jar

Aber ich kann nicht den Classpath erhalte den new-config Pfadeintrag vor der Anwendung JAR Inhalt zu haben. Ist es hart codiert, dass der Inhalt der JAR ist immer das erste, was auf dem Classpath?

War es hilfreich?

Lösung

Warum nicht einfach die Anwendung aufrufen, ohne Angabe -jar und stattdessen die Anwendung Hauptklasse explizit nennen? Dies ermöglicht Ihnen, sowohl Ihre neue-config und die application.jar auf dem Classpath in der gewünschten Reihenfolge zu setzen:

z. ( "New-config" unter der Annahme ist ein Verzeichnis, die außer Kraft gesetzt Properties-Datei enthält)

java -cp new-config:application.jar Application.Main.Class

Ich glaube, der Name der Hauptklasse kann in der Datei MANIFEST.MF in dem Topf zu finden ....

Andere Tipps

Wenn Sie die Option -jar Ihre Anwendung zu starten:

  

... die JAR-Datei ist die Quelle aller   Benutzerklassen und andere Benutzerklasse   Pfadeinstellungen werden ignoriert .

, wie hier . Eine Abhilfe wäre, um die Classpath in der JAR-Datei Manifest geben Sie den zusätzlichen Pfad enthalten (beschrieben hier ).

Angesichts der Tatsache, dass Sie nur über Änderung der Konfiguration sprechen Sie vielleicht einen anderen Ansatz nehmen, die nicht darauf angewiesen, der Classpath ist. Zum Beispiel habe ich meine Anwendungen durch Frühling typischerweise Dateien mit Eigenschaft konfigurieren den Standort von Datenbanken, um festzustellen, etc. Meine Spring-Konfiguration ist konsistent über Test, QA und Live-Umgebungen, aber ich gehe eine andere Eigenschaft Datei als Argument Befehlszeile, wenn Sie die App starten .

Federkonfiguration Snippet

<bean id="MyDataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
    <property name="url" value="jdbc:microsoft:sqlserver://${dbServer}:${dbPort};DatabaseName=${dbName}"/>
    <property name="username" value="${dbUserName}"/>
    <property name="password" value="${dbPassword}"/>
    <property name="suppressClose" value="false"/>
</bean>

Property Datei-Snippet

dbServer=MyServer
dbPort=1433
dbName=MyDb
dbUserName=Me
dbPassword=foobar

Das JAR-Archiv von der Option -jar angegeben, überschreibt alle anderen Werte.

würden Sie müssen Ihre eigene Lösung withod ClassLoader.getResource() tun es in der Regel mit einer externen Konfigurationsdatei oder bauen.

Wir verwenden eine individuelle Lösung dieses Problem zu lösen - wir die inneren Eigenschaften laden etwa so:

final Properties p = new Properties();
p.load(DefaultConfiguration.class.getResourceAsStream("config.properties"));

Wir laden dann die externe Datei auf die gleiche Art und Weise und die internen Werte mit den externen überschreiben.

Für Informationen darüber, wie das Laden von Klassen Werke sehen:

http://java.sun.com/javase /6/docs/technotes/tools/findingclasses.html

Es kann nicht möglich sein, nur den CLASSPATH verwenden. Es gibt Möglichkeiten, den Anruf zu tätigen zu bekommen, um ClassLoader.getResource() einen statischen Pfad verwenden, um die Ressource zu finden. Wenn es das tut, wird die CLASSPATH umgangen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top