So fügen Sie mit Maven eine Konfigurationsdatei in den Ordner „META-INF / services“ einer JAR ein

75

Ich arbeite an einem Java-Projekt in Eclipse, das mit Maven erstellt wurde. Ich verwende recycelten Code aus einem älteren Projekt. Eine dieser Klassen sucht im META-INF/servicesOrdner der JAR nach einer Datei mit einem bestimmten Namen und analysiert dann den Text dieser Datei. In diesem Beispiel wird nach einer Datei mit dem Namen einer Java-Schnittstelle gesucht und anschließend der Klassenname der Implementierung aus der Datei abgerufen.

Ich versuche also im Grunde, eine Datei mit dem Dateinamen (X) und einer Textzeile (Y) in den Ordner "META-INF / services" der JAR aufzunehmen . Ich vermute, dass dies mit Maven geschehen sollte, vielleicht durch Angabe eines Attributs in der POM-Datei, aber meine Forschung hat nichts ergeben. Ich weiß, dass Sie keine META-Dateien hart codieren oder manuell eingeben sollen, daher bin ich mir nicht sicher, was ich hier tun soll.

Matt Vukas
quelle

Antworten:

123

Erstellen Sie einen neuen Quellordner mit dem Speicherort src/main/resources, erstellen Sie META-INF/servicesdort Ihren Ordner und legen Sie Ihre FQCN-Datei ab. Dies sollte sie automatisch in die JAR-Datei kopieren. Sie haben also:

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | [your service files]

Es ist erwähnenswert, dass dies auch für Gradle-Projekte mit den Standardquellensätzen gilt.

Brian
quelle
1
Was soll in den Dienstordner gelegt werden?
Ozan Kurt
2
@ OzanKurt Bitte werfen Sie einen Blick auf das Javadoc der ServiceLoader-Klasse: docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
Puce
2
@OzanKurt Hier ist der zugehörige Java-Trail . Kurz gesagt, wird der Name der Datei in META-INF / services etwas wie META-INF / services / com.acme.MyInterface sein , und es wird jede FQCN der Implementierungen in Ihrer Anwendung enthalten, die jeweils auf einer neuen Zeile, zBcom.example.MyInterfaceImpl
Brian
Danke @Brian! Das hat mir sehr geholfen!
Andrbmgi
20

Standardmäßig sucht Maven nach Ressourcen unter:

src/main/resources

Also leg es an

src/main/resources/META-INF/services
Puce
quelle
1
Was soll in den Dienstordner gelegt werden?
Ozan Kurt
16

Wenn Ihr Projekt keine Standardverzeichnisstruktur verwendet (oder Sie einfach alternative Ressourcenverzeichnisse wünschen), können Sie Ressourcenverzeichnisse manuell in der POM-Datei angeben .

Wenn sich Ihr META-INF/servicesOrdner beispielsweise in einem Ordner resourcesbefindet, der sich im Stammverzeichnis Ihres Projektverzeichnisses befindet, können Sie ihn wie folgt angeben:

<project>
...
  <build>
    ...
    <resources>
      <resource>
        <directory>resources</directory>
      </resource>
    </resources>
    ...
  </build>
  ...
</project>

Sie können dies verwenden, um mehrere Verzeichnisse anzugeben, indem Sie mehrere <resource>Elemente hinzufügen .

Robert Bartlett-Schneider
quelle
Was soll in den Dienstordner gelegt werden?
Ozan Kurt
@OzanKurt Ich bin mir nicht sicher, was dort alles drin ist, aber ein Beispiel für eine Datei, die normalerweise in META-INF / services gespeichert ist, ist ein benutzerdefinierter CharsetProvider.
Robert Bartlett-Schneider
1
Ich habe das, musste Anmerkungen hinzufügen. Vielen Dank
Ozan Kurt