2017-12-18 4 views
0

Ich verwende einen javaagent für meine Feder Boot-App einbinden und zur Zeit ich es überWie eine javaagent im Frühjahr Boot-App Boot gradle Plugin

java -javaagent:agent.jar -jar app.jar 

Mein Projekt leite ein gradle Projekt und ich möchte die agent.jar innerhalb des app.jar einbetten, so dass ich es als

java -javaagent:app.jar -jar app.jar 

laufen sie kann wie erwähnt hier über Boot maven Plugin getan werden - https://jeroendruwe.be/spring-boot-and-new-relic/ aber es gibt keine Alternative für Boot gradle Plugin. Der nächste, den ich finde, ist dies - https://jdpgrailsdev.github.io/blog/2014/04/08/spring_boot_gradle_newrelic.html, aber das Glas wird nicht wie beabsichtigt eingebettet.

Gibt es es sowieso über Gradle?

+0

Was ist der Zweck? Es ist definitiv keine bewährte Methode, infrastrukturelle/util/etc-Bibliotheken in einen Microservice einzubetten, was Ihre Spring-Boot-Anwendung wahrscheinlich ist. – yuranos87

+0

Der Zweck ist, dass die Spring Boot App in Cloud Foundry ausgeführt wird und wir noch keinen Service für diesen Agenten haben. Daher möchte ich, dass der Agent-Jar in den Boot-Jar eingebettet wird, damit wir ihn ohne weitere Konfigurationsänderungen auf cf schieben und damit fertigstellen können. –

Antwort

0

Kann als Abhängigkeitsjar vom lokalen Verzeichnis hinzugefügt werden. 'libs' ist das Verzeichnis in Ihrem Projekt.

Abhängigkeiten { filetree (dir: 'libs', schließen ein: * .jar ') kompilieren }

+0

Dies würde es unter BOOT-INF/lib-Verzeichnis setzen, das den Agenten-Jar während des Bootstrap nicht laden wird. Aber ich möchte die Klassen des Agenten-Jar im obersten Verzeichnis des Boot-Jar, so Pre-Main-Anweisung in der MANIFEST.MF könnte die Klasse finden. –

0

gradle jar:

jar { 
manifest{ 
    attributes "Agent-Class" : "com.......agent.AgentTest" 
    //attributes "Premain-Class" : "com.......agent.AgentTest" 
     } 
    } 

Althought, ich mag, dies zu tun bin mit:

public static void main(String[] args) throws Exception { 
    String pid = "6236"; 
    String agentPath = "..."; 
    VirtualMachine virtualMachine = com.sun.tools.attach.VirtualMachine.attach(pid); 
    virtualmachine.loadAgent("/home/aaa/Code/agent-1.0-SNAPSHOT.jar"); 
    virtualMachine.detach(); 
} 
+0

Wie erhalte ich die PID, wenn ich die App in der cf-Umgebung starte? Mein einziges Ziel ist es, dies in einer anderen cf-Umgebung auf tragbare Weise auszuführen. –

+0

@AnindyaChatterjee Tut mir leid, ich bin mir nicht sicher. Vielleicht können Sie es versuchen: build.gradle apply plugin: 'maven' und das Detail könnte concult sein https://docs.gradle.org/current/userguide/maven_plugin. html – saaav

0

Haben Sie versucht,

java -Xbootclasspath=('your path'/app.jar or 'your path to libs'/agent.jar) -javaagent:'your path'/app.jar -jar 'your path'/app.jar 

?

Ein anderer Ansatz: Verwenden Sie jar als Abhängigkeit und verschieben Sie (oder erstellen Sie eine andere) Ihre premain-Klasse in Spring Boot-Anwendungs-jar.

+0

Dies würde die Agentenklasse in den BOOT-INF/classes-Ordner innerhalb des Boot-jar platzieren, was wiederum nicht über das Argument -javaagent zugänglich ist. –

+0

Interessant, -Xbootclasspath (https://docs.oracle.com/cd/E15289_01/doc.40/e15062/optionx.htm#i1018570) ist eine Option, die nicht für die Kompilierung gedacht ist. Sie ist für ein laufendes Glas gedacht. Ich verstehe, wie es JAR-Datei überall kopieren könnte? Warum kopieren Sie nicht einfach die Agent-JAR-Datei in den Stammordner? https://stackoverflow.com/questions/8565863/copy-files-to-rootdir-in-gradle. – egorlitvinenko

+0

Ich habe nichts über bootclasspath gesagt. Was ich meinte, ist, wenn ich ein Spring Boot-Jar mit Gradle Build erstelle, wird die Premain-Klasse in den BOOT-INF/Klassen-Ordner gestellt und es wird das Agent-Jar in den BOOT-INF/libs-Ordner gestellt. Ihre Befehlszeilenarg funktioniert nicht mit diesem Boot-Jar-Layout. –