Java模块不适用于aspectj maven插件



我正试图将我的java项目迁移到11并使用模块,但aspectj编译器似乎无法从我的maven依赖项中识别模块?

错误:

mvn clean compile
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------< com.test:test >----------------------------
[INFO] Building test 1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test ---
[INFO] Deleting /Users/piotr/Documents/mvntest/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/piotr/Documents/mvntest/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ test ---
[INFO] Required filename-based automodules detected: [passay-1.6.0.jar]. Please don't publish this project to a public artifact repository!
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /Users/piotr/Documents/mvntest/target/classes
[INFO] 
[INFO] --- aspectj-maven-plugin:1.12.6:compile (default) @ test ---
[INFO] Showing AJC message detail for messages of types: [error, warning, fail]
[ERROR] passay cannot be resolved to a module
/Users/piotr/Documents/mvntest/src/main/java/module-info.java:2
requires passay;
^
[ERROR] Must declare a named package because this compilation unit is associated to the named module 'test'
/Users/piotr/Documents/mvntest/src/main/java/main.java:1
(no source information available)
[ERROR] The type org.passay.PasswordValidator is not accessible
/Users/piotr/Documents/mvntest/src/main/java/main.java:1
import org.passay.PasswordValidator;
^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] PasswordValidator cannot be resolved to a type
/Users/piotr/Documents/mvntest/src/main/java/main.java:5
System.out.println(new PasswordValidator());
^^^^^^^^
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.169 s
[INFO] Finished at: 2020-12-14T10:22:00+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.nickwongdev:aspectj-maven-plugin:1.12.6:compile (default) on project test: AJC compiler errors:
[ERROR] error at requires passay;
[ERROR]          ^
[ERROR] /Users/piotr/Documents/mvntest/src/main/java/module-info.java:2:0::0 passay cannot be resolved to a module
[ERROR] error at (no source information available)
[ERROR] /Users/piotr/Documents/mvntest/src/main/java/main.java:1:0::0 Must declare a named package because this compilation unit is associated to the named module 'test'
[ERROR] error at import org.passay.PasswordValidator;
[ERROR]        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] /Users/piotr/Documents/mvntest/src/main/java/main.java:1:0::0 The type org.passay.PasswordValidator is not accessible
[ERROR] error at System.out.println(new PasswordValidator());
[ERROR]                        ^^^^^^^^
[ERROR] /Users/piotr/Documents/mvntest/src/main/java/main.java:5:0::0 PasswordValidator cannot be resolved to a type
[ERROR] 
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

pom.xml:

<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<packaging>jar</packaging>
<version>1</version>
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<aspectj.version>1.9.6</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>${java.version}</release>
</configuration>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.12.6</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<configuration>
<complianceLevel>${java.version}</complianceLevel>
<weaveMainSourceFolder>true</weaveMainSourceFolder>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

src/main/java/module-info.java:

module test {
requires passay;
}

src/main/java/main.java:

import org.passay.PasswordValidator;
public class main {
public static void main() {
System.out.println(new PasswordValidator());
}
}

为了实现这一点,AspectJ Maven插件必须至少支持AspectJ编译器的命令行参数--module-info,类似于javac。该参数的存在没有记录在ajc命令行帮助中,而是间接记录在AspectJ 1.9.0发行说明中。

我以前从未使用过Java 9+模块,尽管出于其他原因我使用了最新的Java版本。为了找到如何从命令行编译和运行项目,我不得不进行一些实验,基本上是这样的:

ajc -11 --module-path "C:Usersalexa.m2repositoryorgpassaypassay1.6.0passay-1.6.0.jar" -cp "C:Usersalexa.m2repositoryorgaspectjaspectjrt1.9.6aspectjrt-1.9.6.jar" -sourceroots srcmainjava -outjar targettest-1.jar
java --module-path targettest-1.jar;C:Usersalexa.m2repositoryorgpassaypassay1.6.0passay-1.6.0.jar;C:Usersalexa.m2repositoryorgaspectjaspectjrt1.9.6aspectjrt-1.9.6.jar --module test/de.scrum_master.stackoverflow.q65286736.Application

对不起,我已经把你的主类移到了默认包之外,如下所示(main方法也是没有任何参数的伪代码(:

module test {
requires passay;
}
package de.scrum_master.stackoverflow.q65286736;
import org.passay.PasswordValidator;
public class Application {
public static void main(String[] args) {
System.out.println(new PasswordValidator());
}
}

然后,我实验性地向插件添加了一个参数javaModules,正如您在我的pull请求中看到的那样。随意通过克隆我的存储库分叉来构建它。

然后这样修改你的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<packaging>jar</packaging>
<version>1</version>
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<aspectj.version>1.9.6</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>${java.version}</release>
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.12.7-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<configuration>
<complianceLevel>${java.version}</complianceLevel>
<encoding>${project.build.sourceEncoding}</encoding>
<!--<weaveMainSourceFolder>true</weaveMainSourceFolder>-->
<showWeaveInfo>true</showWeaveInfo>
<Xlint>ignore</Xlint>
<!--<verbose>true</verbose>-->
<!--<warn>constructorName,packageDefaultMethod,deprecation,maskedCatchBlocks,unusedLocals,unusedArguments,unusedImport</warn>-->
<!--<argumentFileName>argumentFileName.txt</argumentFileName>-->
<javaModules>
<javaModule>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
</javaModule>
</javaModules>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

决定性的区别当然是新参数的使用:

<javaModules>
<javaModule>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
</javaModule>
</javaModules>

现在项目编译了,您还可以使用我上面发布的第二个命令运行应用程序,即java --module-path targettest-1.jar;...。对我来说,IntelliJ IDEA在其POM语法高亮显示中识别了新参数,并且运行应用程序时没有任何问题。

这并不是对您能想到的所有Java模块相关参数的完全支持,但我认为这是一个起点。欢迎反馈。