Как поместить классы для javaagent в путь к классам

Я пытаюсь разработать javaagent, который будет использовать код с помощью asm-4. На данный момент я столкнулся с довольно простой проблемой, загрузчик классов для javaagent не видит зависимостей asm и, следовательно, терпит неудачу. Должен ли я предоставлять jar-with-dependencies (aka maven build plugin), который содержит все необходимые классы агентом, или есть другой способ добавить классы в java-агент? Ссылка на jar asm-all.jar непосредственно в пути к классам не помогла. Создание jar-with-dependencies сначала не помогло, поскольку атрибут Premain-Class не мог быть установлен с помощью плагина сборки. Помощь приветствуется; -)

Ответ 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.