Я пытаюсь разработать javaagent, который будет использовать код с помощью asm-4. На данный момент я столкнулся с довольно простой проблемой, загрузчик классов для javaagent не видит зависимостей asm и, следовательно, терпит неудачу. Должен ли я предоставлять jar-with-dependencies (aka maven build plugin), который содержит все необходимые классы агентом, или есть другой способ добавить классы в java-агент? Ссылка на jar asm-all.jar непосредственно в пути к классам не помогла. Создание jar-with-dependencies сначала не помогло, поскольку атрибут Premain-Class не мог быть установлен с помощью плагина сборки. Помощь приветствуется; -)
Как поместить классы для javaagent в путь к классам
Ответ 1
ok, нашел его, экспериментируя. Зависимые классы должны быть частью jar, которые могут быть созданы плагином сборки maven, например:
<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, и все работает нормально.
Ответ 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(обратите внимание, что мы ссылаемся на пользовательский MANIFEST)
<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);
}
}
Мое главное приложение:
пакет ar.com.docdigital;
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
Ответ 3
Я думаю, вы можете указать Class-Path в файле Manifest.mf в MyAgent.jar.