如何将 Java 代理打包到主机项目中?

How to Package a Java Agent into the Host Project?

提问人:Eric Chen 提问时间:10/10/2023 最后编辑:Eric Chen 更新时间:10/10/2023 访问量:63

问:

你好,我是 Stack Overflow 的新手,在提问方面我很笨拙。 但如果问题不清楚,我将提供更多信息。 这是我遇到的问题,如下所示:

背景: 我有两个项目,一个是我的商业项目 A,另一个是我的 Java 代理项目 B。我使用'java -javaagent:B.jar -jar A.jar'方法启动它们。

分歧:目前,有两种不同的方法:

(I) 我将 B.jar 和相关配置文件放在 A Base_Dir 的父目录下的“serial”目录下.jar并使用 Shell 脚本启动它们。

(II)我的主管希望我将“serial”目录打包到A.jar中。

问题:关于上述分歧,我有两个问题:

(I)在Java项目中将“serial”目录打包成A.jar是否可行?

(II) 通常,解决此类项目结构问题的更常见做法或最佳做法是什么?

如果我收到您的任何回复,我将不胜感激。

目录结构:

我不能在我的问题中发布图片,这是我的结构:

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

业务 jar 和 serial 目录 串口目录的内容

Java Maven 字节码 byte-buddy javaagents

评论


答:

3赞 Holger 10/10/2023 #1

当包含在 中时,该选项不起作用,因为此选项在默认文件系统中查找文件,而不是在另一个 jar 文件中查找文件。B.jarA.jar-javaagent:B.jar

从 Java 9 开始,您可以在清单中指定 Launcher-Agent-Class 属性,以在同一 jar 文件中指定 Agent 类,以便在启动应用程序时自动启动(因此不需要)。这要求直接添加 Java 代理 (of ) 的类,而不是作为单个条目添加到。A.jar-jar A.jar-javaagentB.jarA.jarB.jarA.jar

在添加其他资源时,您可能必须调整代理的代码以使用或代替在默认文件系统中的 jar 文件旁边查找文件,以防它需要读取其中之一(例如 )。getResourcegetResourceAsStreamConfoundLogback.xml

其他文件,例如 并且,看起来不像是特工需要的,而是打算被其他工具甚至人类读取。对于他们来说,将这些文件放在 jar 文件中而不是立即在目录中可见是否足够,这是一个超出 Stackoverflow 范围的问题。readme.mdsample-configs.properties

总而言之,仅仅将目录添加到应用程序的 jar 文件中是行不通的。serial

评论

0赞 Eric Chen 10/13/2023
我非常感谢您的回复,我获得了大量有价值的信息。再次感谢。