在现有maven项目中集成JMH代码

在现有maven项目中集成JMH代码,maven,jmh,Maven,Jmh,JMH建议您使用他们的原型来创建项目。我能够以这种方式运行我的基准代码,方法是将我的代码作为依赖项包含在此生成的项目中进行基准测试 然而,我现在正试图使用概要文件将基准测试直接集成到我的项目源代码中 <profiles> <profile> <id>benchmark</id> <build> <plugins> <plug

JMH建议您使用他们的原型来创建项目。我能够以这种方式运行我的基准代码,方法是将我的代码作为依赖项包含在此生成的项目中进行基准测试

然而,我现在正试图使用概要文件将基准测试直接集成到我的项目源代码中

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

如果您真的需要JMH和一个单独的pom,我们将非常感谢您提供的任何指针。我将使用调用它。

请提供MCVE:。否则,这看起来像是一个构建配置出错了,JMH生成的基准测试——以及那些引用项目类的基准测试——在项目类更改后与项目的其余部分失去了同步。参见示例:JMH是否需要是一个完全独立的项目,有自己的pom,或者它可以是一个模块,有pom作为主项目的子项目?“运行JMH基准测试的推荐方法是使用Maven设置独立项目,该项目依赖于应用程序的jar文件。最好使用这种方法来确保基准正确初始化并产生可靠的结果。可以从现有项目中运行基准测试,甚至可以从IDE中运行基准测试,但是设置更复杂,结果也不太可靠。”
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)