首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将javaagent的类放入类路径

如何将javaagent的类放入类路径
EN

Stack Overflow用户
提问于 2013-04-08 14:28:45
回答 5查看 18.1K关注 0票数 14

我正在尝试开发一个javaagent,它可以在asm-4的帮助下插入代码。现在我遇到了一个非常基本的问题,javaagent的类加载器看不到asm依赖项,因此失败了。我是否必须提供一个带有依赖项的jar(也称为maven build plugin),其中包含代理所需的所有类,或者是否有其他方法可以将类添加到java代理?在类路径中直接引用jar asm-all.jar没有任何帮助。一开始,构建带有依赖关系的jar并没有什么帮助,因为Premain-Class属性不能用组装插件来设置。感谢您的帮助;-)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-09 04:16:08

好的,通过实验找到了它。依赖类应该是jar的一部分,jar可以由maven汇编插件创建,例如:

代码语言:javascript
复制
    <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>

使用jar作为javaagent路径,一切都会正常工作。

票数 12
EN

Stack Overflow用户

发布于 2016-03-19 21:21:58

我关注了这个blog post。这是我是如何工作的,以获得对象的大小。

/MANIFEST.MF

代码语言:javascript
复制
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中(请注意,我们引用自定义清单)

代码语言:javascript
复制
<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>

My Instrumentation Agent:

代码语言:javascript
复制
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);
    }
}

我的主应用:

打包ar.com.docdigital;

代码语言:javascript
复制
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输出放在一起(&CLI):

代码语言:javascript
复制
$ 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
票数 7
EN

Stack Overflow用户

发布于 2018-09-01 00:23:05

我的CustomAgent使用了maven-jar-plugin。我没有任何依赖的模块/jars,所以使用组装插件是一种过度的杀伤力。

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15872642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档