2016-03-22 8 views
2

Ich versuche VertX Mertrics arbeiten zu machen, wenn Sie über das Maven Plugin exec:java laufen.Wie man eine SPI-Implementierung beim Ausführen von exec registrieren: java

Alle funktioniert wie erwartet, wenn ich die Anwendung in eine fatjar verpacken und mit java -jar fat.jar -conf config.json -Dvertx.metrics.options.enabled=true

laufen, wenn ich es mit mvn clean package exec:java -DskipTests laufen sehe ich: 2016-03-22 18:39:58.833 WARN i.v.c.i.VertxImpl:348 - Metrics has been set to enabled but no VertxMetricsFactory found on classpath

ich verschiedene Ansätze versucht:

  • hinzufügen io.vertx:vertx-dropwizard-metrics:3.2.1 als Kompilierabhängigkeit
  • Erstellen Sie eine In-house-Metrik-Implementierung und regis ter es mittels src/main/resources/META-INF/services/io.vertx.core.spi.VertxMetricsFactory Datei (doppelt überprüft, dass es zu target/classes/META-INF/services/io.vertx.core.spi.VertxMetricsFactory tatsächlich kopiert wird) auch
  • ${basedir}/src/main/resources als zusätzliches Classpath Element hinzugefügt wird (zusätzlich zu dem vorherigen Punkt)

Ich habe doppelt geprüft im Debugger, ServiceLoader gibt tatsächlich einen leeren Iterator zurück.

Das ist mein exec-Plugin config: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <additionalClasspathElements> <element>${basedir}/src/main/resources</element> </additionalClasspathElements> <mainClass>io.vertx.core.Launcher</mainClass> <commandlineArgs>run ${vertx.mainVerticle} -conf ${vertx.config}</commandlineArgs> <systemProperties> <systemProperty> <key>vertx.logger-delegate-factory-class-name</key> <value>io.vertx.core.logging.SLF4JLogDelegateFactory</value> </systemProperty> <systemProperty> <key>vertx.metrics.options.enabled</key> <value>true</value> </systemProperty> </systemProperties> </configuration> </plugin>

Hier ist exec:exec Konfiguration, die funktioniert, aber ich wenn verstehen will und warum es (Un-) möglich, es zu tun mit exec:java

<profile> <id>exec</id> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <goals> <goal>exec</goal> </goals> <phase>process-classes</phase> <configuration> <executable>java</executable> <arguments> <argument>-Dvertx.metrics.options.enabled=true</argument> <argument>-Dvertx.logger-delegate-factory-class-name=${vertx.logger-delegate-factory-class-name}</argument> <argument>-classpath</argument> <classpath /> <argument>io.vertx.core.Launcher</argument> <argument>run</argument> <argument>${vertx.mainVerticle}</argument> <argument>-conf</argument> <argument>${vertx.config}</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>

Antwort

1

Haben Sie versucht, exec:exec statt exec:java?

exec:exec läuft in einem separaten Prozess, und dies könnte Ihr Problem lösen.

ServiceLoader verwendet den Klassenlader der Anwendung, um alle in META-INF/services aufgelisteten Klassen zu laden. Aus diesem Grund funktioniert ServiceLoader oft nicht in Umgebungen mit benutzerdefinierten Klassenladeprogrammen (z. B. OSGi).

Da Maven für jedes Maven-Plugin einen eigenen Klassenlader erstellt, sind diese Klassen, selbst wenn Sie Kompilierungszeitabhängigkeiten mit Ihrem SPI deklarieren, nur für den Maven-Klassenlader, nicht jedoch für den Anwendungsklassenlader sichtbar.

+0

Ich weiß, ich könnte 'exec: exec' (wie dies zu java direkt von CLI ausführen würde) verwenden. Es würde mich interessieren zu erfahren, wie genau der Maven Classloader die Verwendung von ServiceLoader ausschließt. Wo finde ich die Details für die Funktionsweise des benutzerdefinierten Classloaders? Was ist, wenn ich den SPI zu den Plugins hinzufüge? –

+0

Es gibt keine speziellen Anforderungen für einen benutzerdefinierten Klassenlader. Es ist der Unterschied zwischen ServiceLoader.loadClass (Class) und ServiceLoader.loadClass (Class, ClassLoader). Wenn der SPI-Consumer die erste Variante ohne expliziten Klassenlader verwendet, wird der Systemklassenlader verwendet. –

Verwandte Themen