2016-03-29 10 views
1

プロジェクトを作成するには、そのアーキタイプを使用することをお勧めします。私はベンチマークコードをこのように生成したプロジェクトの依存関係としてベンチマークするコードをこの方法で実行することができます。既存のMavenプロジェクトにJMHコードを統合

しかし、私は今でIncompatibleClassChangeError

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) 
を私はこれを行うと、プロファイル

<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> 

を使用して私のプロジェクトのソースに直接ベンチマークを統合し、私が手に生成されたベンチマークjarファイルを実行しようとしています

すべてのポインタは高く評価されます

+1

MCVEを提供してください:http://stackoverflow.com/help/mcveそれ以外の場合は、ビルド構成が間違っているように見え、JMHが生成したベンチマークとプロジェクトクラスを参照するベンチマークは、プロジェクトクラスが変更された後、プロジェクトの残りの部分と非同期になりました。例えば:http://stackoverflow.com/questions/1980452/what-c​​auses-java-lang-incompatibleclasschangeerror –

答えて

1

あなたは本当に別のpomとJMHが必要です。私はそれを呼び出すためにmaven invoker pluginを使用します。

+0

JMHは、独自のpomを持つ全く別のプロジェクトである必要がありますか、それとも、pomを子として持つモジュールメインプロジェクトの? – Freiheit

+1

"JMHベンチマークを実行するには、Mavenを使用してアプリケーションのjarファイルに依存するスタンドアロンプ​​ロジェクトをセットアップすることが推奨されます。この方法は、ベンチマークが正しく初期化され、信頼できる結果が得られるようにすることが望ましい方法です。既存のプロジェクト内から、さらにはIDE内からでもベンチマークを実行できますが、セットアップはより複雑で結果は信頼性が低くなります。 – Alun

関連する問題