JMH empfiehlt, dass Sie seinen Archetyp verwenden, um ein Projekt zu erstellen. Ich kann meinen Benchmark-Code auf diese Weise ausführen, indem ich meinen Code als eine Abhängigkeit in dieses generierte Projekt einbeziehe.JMH-Code in vorhandenes Maven-Projekt integrieren
aber ich versuche jetzt die Benchmarks direkt in meinem Projekt Quelle mit Hilfe eines Profils
<profiles>
<profile>
<id>benchmark</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${uberjar.name}</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<!--
Shading signed JARs will fail without this.
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
-->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</dependency>
</dependencies>
</profile>
</profiles>
zu integrieren Wenn ich dies tun, und führen Sie den erzeugten Benchmark jar ich eine IncompatibleClassChangeError bekommen
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.openjdk.jmh.Main.main(Main.java:44)
Alle Zeiger würden sehr geschätzt werden
Bitte geben Sie einen MCVE an: http://stackoverflow.com/help/mcve. Ansonsten sieht das so aus, als sei eine Build-Konfiguration falsch gelaufen, und Benchmarks, die JMH generiert hat - und solche, die auf die Projektklassen verweisen - wurden mit dem Rest des Projekts synchronisiert, nachdem sich die Projektklassen geändert haben. Siehe zB: http://stackoverflow.com/questions/1980452/what-causes-javal-lang-incompatibleclasschangeerror –