Frage

Ich erstelle ein Befehlszeilentool, das auf einigen Konfigurationsdateien basiert.

Bei der Entwicklung habe ich diese Dateien abgelegt src/main/resources, und abgerufen durch getClass().getResourceAsStream("/config-file-name"), was gut funktioniert.

Ich wähle Maven-Assembly-Plugin, um das JAR mit allen Abhängigkeiten zu erstellen.

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.myproject.Scheduler</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                   <id>make-my-jar-with-dependencies</id>
                   <phase>package</phase>
                   <goals>
                       <goal>single</goal>
                   </goals>
               </execution>
            </executions>
    </plugin>       

Die Konfigurationsdateien sind alle in JAR verpackt, aber ich möchte sie trennen.

Also füge ich folgende Konfiguration hinzu:

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>conf.properties</include>
            </includes>
            <filtering>true</filtering>
            <excludes>
                <exclude></exclude>
            </excludes>
        <targetPath>..</targetPath>             
        </resource>
    </resources>

Danach liegen die Konfigurationsdateien neben der JAR-Datei statt in der JAR-Datei eingeschlossen.

Aber mein Code kann jetzt nicht auf die Dateien zugreifen.

Muss ich meine Art des Zugriffs auf die Dateien im Code ändern?

Oder sollte ich diese Dateien nicht einfügen müssen? src/main/resources/, irgendeine Alternative?

Wenn es jemand weiß, bitte um Hilfe.

Danke.


Aktualisieren:Schließlich gebe ich die Verwendung der Maven-Ressourcendatei auf, stattdessen setze ich den Dateipfad standardmäßig auf denselben Pfad wie JAR. Alles funktioniert gut, außer Eclipse beschwert sich.

Da ich die Konfigurationsdatei aus dem JAR verschieben möchte und nicht möchte, dass sie sich im Ordner „target/classes“ befindet, verwende ich sie <targetPath>..</targetPath> um die Konfigurationsdatei in dasselbe Verzeichnis wie die JAR-Datei zu verschieben.

Wenn ich die Eclipse-Projekteinstellungen neu generiere, sagt Eclipse:Der Ausgabeordner „project/target/test-classes“ kann nicht im Ausgabeordner „project/target“ verschachtelt werden.

Hilft mir jemand?

War es hilfreich?

Lösung 3

Ich gebe die Verwendung der Maven-Ressourcendatei endlich auf und setze stattdessen den Dateipfad standardmäßig auf denselben Pfad wie JAR. Alles funktioniert gut, außer Eclipse beschwert sich.

(Da ich die Konfigurationsdatei aus dem JAR verschieben möchte und nicht möchte, dass sie sich im Ordner „target/classes“ befindet, verwende ich ..um die Konfigurationsdatei in dasselbe Verzeichnis wie die JAR-Datei zu verschieben.Wenn ich die Eclipse-Projekteinstellungen neu generiere, sagt Eclipse:Der Ausgabeordner „project/target/test-classes“ kann nicht im Ausgabeordner „project/target“ verschachtelt werden.)

Ich habe bis jetzt keine Lösung gefunden, es scheint ein Eclipse-Bug zu sein.

Jetzt gebe ich Eclipse auf und bin zu IntelliJ IDEA gewechselt, es ist eine ziemlich schöne IDE, vor allem perfekt in Maven integriert.Ich werde jede Gelegenheit vermeiden, Eclipse für ein Maven-Projekt zu verwenden.

Andere Tipps

Ihre Anwendung kann nicht auf die Konfigurationsdateien zugreifen, da sie sich nicht mehr in ihrem Klassenpfad befindet.

Wenn Sie Ihre Konfigurationsdateien vom Rest der Anwendung trennen möchten, sollten Sie sich Ihre Konfigurationsdateien noch einmal ansehen Montageformat.Möglicherweise möchten Sie „bin“ anstelle von „jar-with-dependencies“ verwenden, obwohl dies mit Herausforderungen bei der Verteilung und Verwendung verbunden ist.

Je nachdem, wie kompliziert die Eigenschaftendatei ist, können Sie die Filterfunktion des Ressourcen-Plugins verwenden, um den Wert basierend auf Maven-Profilen zu ändern.Wenn Sie beispielsweise eine Eigenschaft mit dem Namen „location“ haben möchten, können Sie ein Entwicklungs- und Produktionsprofil definieren und dann den Wert auf eine Maven-Eigenschaft im POM (oder in „profiles.xml“, wenn Sie Maven 2 verwenden) festlegen:

<properties>
  <my.location>the_real_value</my.location>
</properties>

Dann würden Sie in der Eigenschaftendatei Folgendes tun:

location=${my.location}

Stellen Sie einfach sicher, dass Sie die Filterung in Ihrem Pom aktiviert haben, etwa so:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

Wenn Sie beim Erstellen im Zielverzeichnis nachsehen und diese Eigenschaftendatei anzeigen, sollten Sie den korrekten ersetzten Wert sehen.

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