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 zutarget/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>
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? –
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. –