我有一个jar,里面有一个主类。
我使用命令java -jar my.jar
执行它
此主jar依赖于another.jar
(例如joda-time.jar
)。
现在我想拦截another.jar
的一个方法,并说我想打印日志。
顺便说一下,我想像往常一样使用my.jar
,我的意思是我会像往常一样调用它:java -jar my.jar
.
我已经找到了关于外部库编织的a very nice example on github。
这个例子,截取了joda时间库的一个方法。
它对joda时间的toString()
方法有一定的借鉴意义。
但是,它使用单元测试来拦截和演示。
我已经将给出的示例编译并打包为my_aspect.jar
。
之后,我将my_aspect.jar
移到执行目录,其中包含my.jar
、joda-time.jar
。
最后,我还将aspectjrt.jar
和aspectjweaver.jar
添加到同一目录中。
当我调用java -jar my.jar
时,不会发生拦截。
我想我必须告诉my_aspect.jar
一些要拦截的东西,但我不知道该说什么。
下面是my.jar的主要类。
它只是调用拦截的方法。
package com.github.example;
import org.joda.time.DateTime;
public class Main {
public static void main(String[] args) {
System.out.println(new DateTime().toString());
}
}
1条答案
按热度按时间ffvjumwh1#
如果使用编译时编织或二进制编织,则
aspectjrt.jar
和my_aspect.jar
都需要位于类路径上。对于加载时编织,您需要使用
java -javaagent:/path/to/aspectjweaver.jar -cp my_aspect.jar -jar my.jar
。您用作模板的项目也是这样做的,请参见此处。如果您不想使用Java代理,也不想在Java命令行上引用任何AspectJ,那么您唯一的选择就是对
another.jar
进行二进制编织,创建一个新版本,然后创建一个uber JAR(fat JAR),使用One-JAR之类的工具压缩整个应用程序,包括依赖项和AspectJ运行时(还有一个Maven插件)。你的问题不够详细,我无法更准确地回答.
**更新:**因为你说你更喜欢OneJar解决方案,所以你可以search for my related posts。但是那些帖子里的组ID
org.dstovall
已经过时了。那个版本很久以前就不维护了,所以我切换到com.jolira
分支,比如说,在支持AspectJ的应用程序中使用它,当然是与AspectJ Maven插件结合使用: