AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

问题描述 投票:0回答:1

假设我有一个通用的多模块 Maven 项目,其中的模块用作跨多个项目的依赖项,我想将我的方面编织到 Hikari 依赖类中,并在这些通用模块中创建此逻辑,并使这些通用的多模块- 模块用户拥有编织的 Hikari jar。我猜需要以下步骤:

  1. 使用方面编译代码(做到了)
  2. 使用 1) 中的代码重新打包外部 jar
  3. 以某种方式强制所有具有这种共同依赖关系的项目使用这个重新打包的 jar。

我对步骤 2-3 的可能性有点困惑,并且没有找到任何可靠的指南或文档参考。是否有可能所有更改对于依赖项用户来说都是无缝的?查看或使用的项目:git-repo

java maven aop aspectj hikaricp
1个回答
0
投票

首先,我确实相信

AspectJ
对于这种特殊情况来说不是正确的选择,因为您正在使用
spring-framework
,您可以使用
BeanPostProcessor
datasource-proxy
项目
构建更优雅的解决方案。喜欢:

public class DiagDataSourcePostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
        if (!(bean instanceof DataSource)) {
            return bean;
        }

        ProxyDataSourceBuilder builder = ProxyDataSourceBuilder.create(beanName, (DataSource) bean);
        builder.listener(new JdbcLifecycleEventListenerAdapter() {

            public void beforeClose(MethodExecutionContext executionContext) {
                if (executionContext.getTarget() instanceof Connection) {
                    // some logic here
                }
            }

            public void afterGetConnection(MethodExecutionContext executionContext) {
                // some logic here
            }


        });
        return builder.build();
    }

}
@Bean
public static BeanPostProcessor diagDataSourcePostProcessor() {
    return new DiagDataSourcePostProcessor();
}

关于您的aspectj项目,它包含一些实际上阻止您实现目标的气味:

  1. 您应该避免在聚合 pom 中定义插件和依赖项 - 在您的情况下,您已将
    aspectj
    模块转换为“应用程序”,但是它应该是一个“库”,因此,聚合 pom (
    demo
    ) 应该如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>aspectj-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <modules>
        <module>aspectj</module>
        <module>some-app</module>
    </modules>

</project>
  1. 由于
    aspectj
    模块的目的是构建某种“增强”版本的
    HikariCP
    (在编译时编织的情况下),因此它不应该“依赖”于
    HikariCP
    ,否则应用程序类路径将包含两个
    HikariCP
    库的版本:“增强”和原始版本,因此,
    aspectj
    pom 应该如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>aspectj</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.20</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP</artifactId>
                <version>5.0.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.14.0</version>
            <configuration>
                <complianceLevel>11</complianceLevel>
                <showWeaveInfo>true</showWeaveInfo>
                <verbose>true</verbose>
                <Xlint>ignore</Xlint>
                <weaveDependencies>
                    <weaveDependency>
                        <groupId>com.zaxxer</groupId>
                        <artifactId>HikariCP</artifactId>
                    </weaveDependency>
                </weaveDependencies>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    </build>

</project>
  1. 而且,我相信,很明显应用程序模块(
    some-app
    )应该依赖于
    aspectj
    模块而不依赖于
    HikariCP
    ,所以,最后我们得到:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>some-app</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>aspectj</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.5.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
                <version>3.1.4</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.zaxxer</groupId>
                        <artifactId>HikariCP</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

不幸的是,上面的配置并不可靠,问题是它确实在maven上下文中工作,但不可能在IDE中顺利工作。

© www.soinside.com 2019 - 2024. All rights reserved.