![](/img/trans.png)
[英]how to package the .class under the web-inf/classes as a jar and put it to the web-inf/lib dir
[英]How to override some classes in a jar in WEB-INF/lib with another jar in JBoss EAP?
如果要覆盖的类称为com.example.FooServlet
并且此类位于jar WEB-INF/lib/foo.jar
,那么如何使用另一个jar中的com.example.FooServlet
类来覆盖它,比如bar.jar
?
或者有没有办法确保首先加载bar.jar
中的bar.jar
?
使bar.jar
成为一个模块是不行的,因为FooServlet
从WEB-INF/lib
许多jar中导入了大量的类。
正如我上面所说的,我试图在一个模块中包含bar.jar
,但是找不到类或没有类def错误(记不清楚)因为FooServlet
扩展/实现了一些额外的类/接口,它们位于第三方jar中WEB-INF / lib目录下。
我不允许触摸foo.jar
或WEB-INF/lib
中已存在的任何jar。
你说你不能触摸现有的罐子,你似乎暗示你可以在WEB-INF/lib
添加你的罐子。
根据这个 :
WEB-INF/lib/*.jar
下,jar没有指定的优先顺序。 bar.jar
,你不知道它是否会在foo.jar
之前或之后foo.jar
。 WEB-INF/classes
classes下的WEB-INF/classes
必须在WEB-INF/lib/*.jar
之前加载 假设你可以在WEB-INF/lib
下添加一个jar,你应该能够在WEB-INF/classes
下添加一个(或几个) WEB-INF/classes
,而不需要触及那些WEB-INF/classes
。
因此,如果您希望首先加载bar.jar
的类,则可以在WEB-INF/classes
下解压缩该jar的内容(或者只是要优先加载的类 - 例如WEB-INF/classes/com/example/FooServlet.class
)。
查看JBoss模块以及如何通过jboss-deployment-structure.xml
部署描述符处理它们。
很简单...
对于2个不同的WAR文件,您可以在不同的jars文件中使用不同的com.example.FooServlet。
您只需要将您的foo.jar和boo.jar文件从WAR文件中取出并将它们添加到相应的模块中。
WAR的ClassLoader从您在jboss-deployment-structure.xml
定义的模块中选择所需的类,并且永远不会与其他版本冲突。
假设您可以完全控制JBoss的启动方式,或者至少可以更改JBoss的启动设置 - 您的帮助就是Java代理。
简而言之,Java代理是JVM的自定义“插件”jar,它可以拦截该JVM对每个类和任何类的加载。 并且 - 正是您需要的 - 它可以执行任何截获的类的字节代码的替换。 进一步阅读Java代理概念
你想要实现的目标不是全新的,似乎已经在某种程度上得到了解决。 看看这个问题以及答案 - 看起来几乎有关于编写代理的完整指南,该代理根据提供的外部jar替换类替换类。
-javaagent:/path/to/your/agent.jar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.