2016-03-29 4 views
1

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

+1

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 –

Antwort

1

Sie brauchen wirklich JMH mit einem separaten Pom. Ich würde die maven invoker plugin verwenden, um es aufzurufen.

+0

Muss JMH ein völlig separates Projekt mit seinem eigenen Pom sein oder kann es ein Modul mit einem Pom als Kind sein vom Hauptprojekt? – Freiheit

+1

"Die empfohlene Methode zum Ausführen eines JMH-Benchmarks ist die Verwendung von Maven zum Einrichten eines eigenständigen Projekts, das von den JAR-Dateien Ihrer Anwendung abhängt. Dieser Ansatz wird bevorzugt, um sicherzustellen, dass die Benchmarks korrekt initialisiert werden und zuverlässige Ergebnisse liefern Benchmarks innerhalb eines vorhandenen Projekts ausführen, und sogar innerhalb einer IDE, jedoch ist die Einrichtung komplexer und die Ergebnisse sind weniger zuverlässig. " – Alun