我正在尝试将我的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/MojoExecutionExceptionpom.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());
}
}发布于 2020-12-15 14:30:45
为了实现这一点,javac插件必须至少支持AspectJ编译器的命令行参数--module-info,这类似于AspectJ。该参数的存在并未记录在ajc命令行帮助中,而是间接地记录在AspectJ 1.9.0 release notes中。
我以前从未使用过Java模块,尽管我出于其他原因使用了最近的9+版本。为了找出如何从命令行编译和运行你的项目,我不得不做了一些实验,基本上是这样的:
ajc -11 --module-path "C:\Users\alexa\.m2\repository\org\passay\passay\1.6.0\passay-1.6.0.jar" -cp "C:\Users\alexa\.m2\repository\org\aspectj\aspectjrt\1.9.6\aspectjrt-1.9.6.jar" -sourceroots src\main\java -outjar target\test-1.jar
java --module-path target\test-1.jar;C:\Users\alexa\.m2\repository\org\passay\passay\1.6.0\passay-1.6.0.jar;C:\Users\alexa\.m2\repository\org\aspectj\aspectjrt\1.9.6\aspectjrt-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 request中看到的那样。你可以通过克隆我的repository fork自己构建它。
然后像这样修改你的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 target\test-1.jar;...。对我来说,IntelliJ IDEA在它的POM语法突出显示中识别了新参数,并且也没有任何问题地运行应用程序。
这并不是对您能想到的所有Java模块相关参数的完全支持,但我认为这是一个起点。欢迎反馈。
https://stackoverflow.com/questions/65286736
复制相似问题