Maven 外部库加载时间编织为库
我有一个带有主类的jar。Maven 外部库加载时间编织为库,maven,aop,aspectj,aspectj-maven-plugin,Maven,Aop,Aspectj,Aspectj Maven Plugin,我有一个带有主类的jar。 我使用命令java-jarmy.jar执行它 此主jar依赖于另一个.jar(例如,joda time.jar) 现在我想截取另一个.jar的方法,并说我想打印日志。 顺便说一下,我想像往常一样使用my.jar,我的意思是我会像往常一样调用它:java-jar my.jar 我找到了有关外部库编织的信息。 本例截取了joda时间库的一个方法。 它具有joda time的toString()方法的一个方面。 然而,它使用单元测试来拦截和演示 我已经将给定的示例编译并打包
我使用命令java-jarmy.jar执行它 此主jar依赖于另一个.jar(例如,
joda time.jar
)
现在我想截取另一个.jar的方法,并说我想打印日志。
顺便说一下,我想像往常一样使用my.jar
,我的意思是我会像往常一样调用它:java-jar my.jar
我找到了有关外部库编织的信息。
本例截取了joda时间库的一个方法。
它具有joda time的toString()
方法的一个方面。
然而,它使用单元测试来拦截和演示
我已经将给定的示例编译并打包为my_aspect.jar
之后,我将my_aspect.jar
移动到执行目录,其中包含my.jar
,joda time.jar
最后,我还将aspectjrt.jar
和aspectjweaver.jar
添加到同一目录中
当我调用java-jar my.jar
时,interceptin不会发生。
我想我必须告诉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());
}
}
如果使用编译时编织或二进制编织,则aspectjrt.jar
和my_aspect.jar
都需要位于类路径上
对于加载时编织,您需要使用java-javaagent:/path/to/aspectjweaver.jar-cp my\u aspect.jar-jar my.jar
。用作模板的项目也是这样做的,请参见
如果您不想使用Java代理,也不想在Java命令行上引用任何AspectJ,那么您唯一的选择就是为other.jar
进行二进制编织,创建一个新版本,然后创建一个uber jar(胖jar),使用类似于一个JAR的工具(还有一个Maven插件)压缩整个应用程序,包括依赖项和AspectJ运行时
你的问题不够详细,所以我无法更准确地回答
更新:因为您说过您更喜欢OneJar解决方案,所以您可以。不过,那些帖子org.dstowall
中的组ID已经过时。该版本很久以前就没有维护了,所以我切换到了com.joira
fork,例如,将其用于支持AspectJ的应用程序,当然是与AspectJ Maven插件结合使用:
com.joira
onejar maven插件
1.4.4
一罐
0.96
de.scrum\u master.app.FooBar
真的
您已经准确回答了,谢谢。我错过了,实际上学到了,-javaagent部分。因为我不想修改我用来执行的命令,所以我更喜欢über jar版本。很乐意帮忙。我用一些关于OneJar+Maven的信息更新了答案。当然,如果您希望将依赖项解包到uber JAR中,而不是将它们打包为子JAR,那么您也可以使用Maven Shade创建uber JAR。