一些專案背景:我正在使用在 Java 上運行的應用程式。我的目標是收集實時資料以將其發送到在本地服務器上運行的 API。該應用程式被打包到一個 .jar 檔案中,我無法訪問源代碼。(除了這個問題,我試圖反編譯該類以添加其他功能;但是,結果并不好,$access000 ...)
剛剛了解了 AOP,我跑去測驗我的選擇。我花了一個多星期的時間來弄清楚 Maven Setup 和 AspectJ。
我建立了一個“helloworld”專案,在該專案中,我能夠成功地將方面(從 .java 檔案)編織到另一個 .java 檔案中。我的下一步是使用主類創建一個可執行的 .jar 檔案,并將 aspect .java 類編織到其中 - 這樣我就會達到我想要的結果。
是否可以獲取預編譯的 .jar 檔案,將其放入專案并為其撰寫方面?
我不確定我是否誤解了某些東西,我相信這應該是可行的。
來自 AspectJ 開發環境指南:
在 AspectJ 工具中,aspectpath 是查找二進制方面的地方。與類路徑一樣,它可以在包布局中包含存檔(.jar和 .zip 檔案)和包含 .class 檔案的目錄(因為二進制方面位于 .class 檔案中)。
一些參考資料:
- 我正在使用 Eclipse (4.23.0)。
- 該專案是一個 Maven 專案,我添加了 AspectJ 支持(通過轉換為 AspectJ 專案)。
- 我瀏覽了一堆網站和 StackOverflow 回應,找出了 AspectJ for Eclipse 并找到了This Question。TL;DR:我將此站點用作 Eclipse 的 AspectJ(臨時修復)源:https ://aspectj.dev/eclipse/ajdt/421
專案結構
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── hellomaven
│ └── quickstart
│ ├── App.java
│ └── AppAspect.java
└── test
├── java
└── resources
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hellomaven</groupId>
<artifactId>quickstart</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>helloMaven</name>
<description>test</description>
<properties>
<java.version>1.8</java.version>
<junit.version>4.5</junit.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.9</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>${java.version}</source>
<target>${java.version}</target>
<Xlint>ignore</Xlint>
<complianceLevel>${java.version}</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>true</verbose>
<weaveDependencies>
<weaveDependency>
<groupId>com.hellomaven.quickstart.App</groupId>
<artifactId>hello</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<mainClass>com.hellomaven.quickstart</mainClass>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
應用程式.java
package com.hellomaven.quickstart;
public class App {
public static void main(String[] args) {
hello("World");
}
public static void hello(String world) {
System.out.println("Hello " world);
}
}
AppAspect.java
package com.hellomaven.quickstart;
import org.aspectj.lang.annotation.*;
@Aspect
public class AppAspect {
@Before("execution(public static void hello(..))")
public void testAspectBefore() {
System.out.println("Before ok.");
}
}
uj5u.com熱心網友回復:
無論您在何處以何種方式運行代碼,您只需要添加-javaagent:/path/to/aspectjweaver.jar到 Java 命令列即可。此外,對于 LTW,您需要一個aop.xml正確的位置。對于 Maven,這意味著:
aop.xml應位于src/main/resources.- 如果您在 JUnit 測驗中需要 LTW,則需要將
-javaagent引數添加到 Surefire 插件(單元測??試)或 Failsafe 插件(集成測驗)配置中。 - 如果您想使用 Exec Maven 插件啟動您的編譯程式,似乎就是這種情況,您還需要將
-javaagent引數添加到那里的插件配置中。
在 Maven 之外,您需要再次添加-javaagent到命令列。
對不起,通用答案,但這只是您的通用問題的反映。如果您有更精確的后續問題,您可以對此答案發表評論。
一些資源:
- AspectJ 加載時編織
- Maven Surefire
argLine引數 - 目標的Exec Maven
arguments引數exec
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/481857.html
