Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 外部库加载时间编织为库_Maven_Aop_Aspectj_Aspectj Maven Plugin - Fatal编程技术网

Maven 外部库加载时间编织为库

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()方法的一个方面。 然而,它使用单元测试来拦截和演示 我已经将给定的示例编译并打包

我有一个带有主类的jar。
我使用命令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。