Как упаковать агент Java в хост-проект?

Здравствуйте, я новичок в Stack Overflow, я неуклюж, когда дело доходит до вопросов. Но я предоставлю дополнительную информацию, если вопрос неясен. Это проблема, с которой я столкнулся, следующим образом:

Фон: У меня есть два проекта: один — мой бизнес-проект A, а другой — проект Java Agent B. Я запускаю их, используя метод «java -javaagent:B.jar -jar A.jar».

Дивергенция: В настоящее время существует два разных подхода:

(I) Я помещаю B.jar и связанные с ним файлы конфигурации в «последовательный» каталог родительского каталога Base_Dir A.jar и запускаю их с помощью сценария Shell.

(II) Мой руководитель хочет, чтобы я упаковал «последовательный» каталог в A.jar.

Вопросы: По поводу вышеуказанного расхождения у меня есть два вопроса:

(I) Возможно ли упаковать «последовательный» каталог в A.jar в проекте Java?

(II) Каковы обычно наиболее распространенные практики или лучшие практики для решения такого типа проблем со структурой проекта?

Если я получу от вас какой-либо ответ, я буду очень признателен.

Структура каталогов:

Я не могу публиковать изображения в своем вопросе, это моя структура:

C:.
│  SerialNumberAppDemo-1.0-SNAPSHOT.jar
│
└─serial
        ConfoundLogback.xml
        demo-1.jar
        readme.md
        sample-configs.properties

бизнес-банка и каталог серийных номеровсодержимое каталога сериалов

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда B.jar содержится в A.jar, опция -javaagent:B.jar не работает, поскольку эта опция ищет файл в файловой системе по умолчанию, а не внутри другого файла jar.

Начиная с Java 9, вы можете указать атрибут Launcher-Agent-Class в манифесте A.jar, чтобы указать класс агента в том же файле jar, который будет запускаться автоматически при запуске приложения с помощью -jar A.jar (поэтому -javaagent тогда не нужен ). Для этого необходимо, чтобы классы Java-агента (из B.jar) были добавлены непосредственно в A.jar вместо добавления B.jar в A.jar как одна запись.

При добавлении других ресурсов вам, возможно, придется адаптировать код агента для использования getResource или getResourceAsStream вместо поиска файла рядом с файлом jar в файловой системе по умолчанию на случай, если ему потребуется прочитать один из них (например, ConfoundLogback.xml).

Другие файлы, например. readme.md и sample-configs.properties не выглядят так, как будто они нужны Агенту, но предназначены для чтения другими инструментами или даже людьми. Достаточно ли для них того, чтобы эти файлы находились внутри jar-файла, а не были сразу видны в каталоге, — это вопрос, выходящий за рамки Stackoverflow.

Подводя итог, просто добавить каталог serial в jar-файл приложения не получится.

Я искренне ценю ваш ответ и получил массу ценной информации. Еще раз спасибо.

Eric Chen 13.10.2023 08:59

Другие вопросы по теме