maven 外部库加载时间织入为库

nbysray5  于 2023-01-01  发布在  Maven
关注(0)|答案(1)|浏览(138)

我有一个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.jarjoda-time.jar
最后,我还将aspectjrt.jaraspectjweaver.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());
    }
}
ffvjumwh

ffvjumwh1#

如果使用编译时编织或二进制编织,则aspectjrt.jarmy_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插件结合使用:

<plugin>
  <groupId>com.jolira</groupId>
  <artifactId>onejar-maven-plugin</artifactId>
  <version>1.4.4</version>
  <executions>
    <execution>
      <goals>
        <goal>one-jar</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <onejarVersion>0.96</onejarVersion>
    <mainClass>de.scrum_master.app.FooBar</mainClass>
    <attachToBuild>true</attachToBuild>
  </configuration>
</plugin>

相关问题