假设我有一个通用的多模块Maven项目,其中的模块被用作跨多个项目的依赖项,我想将我的方面编织到Hikari依赖类中,并使这个逻辑位于这些公共模块的ON上,使那些常见的多模块用户编织成Hikari JAR.正如我猜测的那样,需要执行以下步骤:

  1. 用方面编译代码(这么做了)
  2. 重新打包外部JAR,代码来自1)
  3. 以某种方式强制所有具有此公共依赖项的项目使用重新打包的JAR.

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

推荐答案

首先,我确实认为AspectJ不是这个特殊情况的合适 Select ,因为您使用的是spring-framework,您可以使用BeanPostProcessordatasource-proxy project构建更优雅的解决方案,smth.比如:

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中定义插件和依赖项--在您的 case 中,您已经将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(in case of compile-time weaving)的某种"增强"版本,所以从"库观察者"的Angular 来看,它不应该"依赖"HikariCP,否则应用程序类路径将包含HikariCP库的两个版本:"增强"和原始版本,因此,aspectjpom应该如下所示:
<?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中顺利工作.

Java相关问答推荐

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

CriteriaQuery with max

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

转换为Biggram

Select 按位运算序列

Spring Batch 5-不要让它在数据库中自动创建表

我无法将附件发送到NetBeans之外

具有阻塞方法的开源库是否应该为执行提供异步选项?

PDFBox未加载内容

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

有没有更快的方法在N个容器中删除重复项?

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

如何使用路径过渡方法使 node 绕圆旋转?

允许同时执行两个方法,但不能同时执行这两个方法

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

当我try 返回可选时,Mock无法正常工作

在数组列表中找到对象后,未从数组中删除对象