如何把类javaagent在类路径(How to put classes for javaagent

2019-08-20 05:19发布

我试图建立一个javaagent即会与ASM-4帮助工具的代码。 现在我stucked有一个非常基本的问题,对于javaagent的类装载器并不见ASM依赖性和为此失败。 我必须提供一个jar-与依赖性(又名Maven构建插件),它包含所有需要的类代理,或者是有另一种方式类添加到Java代理? 直接在classpath中引用的jar ASM-all.jar在没有帮助。 构建JAR-有依赖性并没有在第一帮助,因为倍美力-Class属性无法组装插件进行设置。 帮助表示赞赏;-)

Answer 1:

好吧,发现通过实验。 从属类应该是罐子,其可以通过行家组件的插件来创建,例如部分:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <index>true</index>
                <manifest>
                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                </manifest>
                <manifestEntries>
                    <Premain-Class>test.agent.MyAgent</Premain-Class>
                </manifestEntries>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <!-- this is used for inheritance merges -->
                <phase>package</phase>
                <!-- append to the packaging phase. -->
                <goals>
                    <goal>single</goal>
                    <!-- goals == mojos -->
                </goals>
            </execution>
        </executions>
    </plugin>

使用的水瓶中javaagent路径,一切工作正常。



Answer 2:

我跟着这个博客帖子 。 这是我如何做它的工作,获得对象的大小。

/MANIFEST.MF

Manifest-Version: 1.0
Premain-Class: ar.com.docdigital.InstrumentationApp
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true

在你的pom.xml(注意:我们引用自定义清单)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifestFile>
                MANIFEST.MF
            </manifestFile>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>
                    ar.com.docdigital.App
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

我的仪器代理:

package ar.com.docdigital;

import java.lang.instrument.Instrumentation;

/**
 *
 * @author juan.fernandez
 */
public class InstrumentationApp {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

我的主要应用程序:

包Arkcomkdochdigitl;

import static ar.com.docdigital.InstrumentationApp.getObjectSize;

/**
 *
 * @author juan.fernandez
 */
public class App {
    public static void main (String[] args) {
        System.out.println("Size of CoprimeLong: " + getObjectSize(new CoprimesList.CoprimeLong(1L)));
        System.out.println("Size of Long: " + getObjectSize(new Long(1L)));

    }

}

把所有在一起和CLI输出:

$ mvn package
$ java -javaagent:target/primos-0.1.0-SNAPSHOT.jar -jar target/primos-0.1.0-SNAPSHOT.jar 
  Size of CoprimeLong: 24
  Size of Long: 24


Answer 3:

我想你可以在MyAgent.jar MANIFEST.MF文件指定类路径。



Answer 4:

您应该添加倍美力级条目清单。 我使用gradle这个构建Java项目。

加入这gradle.build

jar {
    manifest {
        attributes(
                "Premain-Class": "com.training.agent.agentapp.SimplestAgent",
                "Can-Redefine-Classes": false,
                "Can-Set-Native-Method-Prefix": false
        )
    }
}

然后你就可以运行它

java -javaagent:agent.jar -jar application.jar

模式细节



Answer 5:

我用的maven-JAR-插件我CustomAgent。 我没有任何从属模块/所以使用组装插件罐子是矫枉过正。

<build>
    <sourceDirectory>src</sourceDirectory>
    <finalName>are-agent</finalName>
    <plugins>           
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                    </manifest>
                    <manifestEntries>
                        <Premain-Class>are.agent.CustomAgent</Premain-Class>
                        <Can-Redefine-Classes>false</Can-Redefine-Classes>
                        <Can-Retransform-Classes>true</Can-Retransform-Classes>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
<build>


文章来源: How to put classes for javaagent in the classpath