Следующий код показывает
- способ определить, какие
-javaagent:...
аргументы виртуальной машины Java,
- способ проверить, если плетение агент класса точки входа AspectJ (которая упоминается в явной записи
Premain-Class:
из aspectjweaver .jar).
Бывший просто доказывает, что аргумент был указан в командной строке, а не то, что агент был фактически найден и запущен.
Последний просто доказывает, что ткач доступен на пути к классам, а не то, что он фактически был запущен как агент. Комбинация обоих должна дать вам довольно большую уверенность в том, что агент действительно активен.
package de.scrum_master.app;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.List;
public class Application {
public static void main(String[] args) {
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
for (String argument : arguments) {
if (argument.startsWith("-javaagent:"))
System.out.println(argument);
}
try {
Class.forName("org.aspectj.weaver.loadtime.Agent");
} catch (ClassNotFoundException e) {
System.err.println("WARNING: AspectJ weaving agent not loaded");
}
}
}
Вы можете также найти вопрос Starting a Java agent after program start и некоторые из его ответов полезных.
Update:
Хорошо, вот это сочетание моего собственного решения и ваша, но тот, который на самом деле работает, даже если ткач недоступен, что очень важно, потому что это то, что вы хотите проверить в первую очередь:
public static boolean isAspectJAgentLoaded() {
try {
Class<?> agentClass = Class.forName("org.aspectj.weaver.loadtime.Agent");
Method method = agentClass.getMethod("getInstrumentation");
method.invoke(null);
} catch (Exception e) {
//System.out.println(e);
return false;
}
return true;
}
Update 2:
После некоторого обсуждения с OP Bacar я решил предложить решение, которое не используют отражения, но ловит NoClassDefError
вместо:
public static boolean isAspectJAgentLoaded() {
try {
org.aspectj.weaver.loadtime.Agent.getInstrumentation();
} catch (NoClassDefFoundError | UnsupportedOperationException e) {
System.out.println(e);
return false;
}
return true;
}
Теперь оба основных типов ошибок
- ткачество агент доступно в пути к классам, но инструментарий не был инициирован, потому что aspectjweaver.jar не был запущен как агент Java,
- агент aspectjweaver.jar не на пути к классам на всех и класс
org.aspectj.weaver.loadtime.Agent
, таким образом, отсутствует
обрабатываются корректно, возвращая false
после предупреждающих сообщений (в этом простом примере только исключения, которые говорят ясно, что неверно) были напечатаны на консоли.
Возможные консольные выходы для двух случаев:
java.lang.UnsupportedOperationException: Java 5 was not started with preMain -javaagent for AspectJ
java.lang.NoClassDefFoundError: org/aspectj/weaver/loadtime/Agent
Спасибо. Вопрос, которым вы ссылались, был моей начальной отправной точкой (я предпочитаю загружать автоматически вместо ошибки), но для динамической загрузки требуется tools.jar, и я не нашел хорошего способа ссылки на tools.jar достаточно переносимым образом, чтобы он хорошо работает в различных средах IDE и maven cmd, на рабочих станциях разработчиков и на наших серверах сборки (хотя все серверы - это просто различные варианты windows + oracle jdk). – bacar
. Итак, вы согласитесь и подтвердите свой ответ, пожалуйста, если это кажется адекватным? Или вы все еще хотите знать? – kriegaex
У меня нет принципиального возражения против маршрута отражения кстати. Я предпочитаю свой статический путь, но все же стоит взять на себя другое в качестве ответа - разные ситуации требуют разных решений. – bacar