【问题标题】:Java modules not working with aspectj-maven-pluginJava 模块不适用于 aspectj-maven-plugin
【发布时间】:2020-12-14 09:45:22
【问题描述】:

我正在尝试将我的 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());
    }
}

【问题讨论】:

    标签: java maven aspectj


    【解决方案1】:

    为了使其工作,AspectJ Maven 插件必须至少支持 AspectJ 编译器 ajc 的命令行参数 --module-info,类似于 javacajc 命令行帮助中未记录该参数的存在,但在 AspectJ 1.9.0 release notes 中间接记录了该参数。

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

    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 模块相关参数,但我认为这是一个起点。欢迎反馈。

    【讨论】:

    • 哇,你在@kriegaex 上做了很多工作。谢谢!我怀疑这个插件可能有点过时了,但我从来没有意识到它有这么糟糕。考虑到 aspectj 和 maven 的流行程度,这样的插件没有得到更好的维护,这有点令人担忧。我也会深入研究一下,看看是否有更好的 gradle 插件,或者这些插件是否一样糟糕......
    • 其实我们都得感谢 Nick Wong 的 fork,在我们提出要求后,现在 IntelliJ IDEA 也认可了。自 Java 8 和 AspectJ 1.8.x 以来,上游的 Mojohaus 插件一直没有得到维护,因为之前的维护者很忙,但没有新的插件加紧工作,内部 Mojohaus 流程似乎阻碍了 Nick 晋升为官方维护者。因此,我可以想象他在那里进行很多活动的动力不是很强,因为情况有些令人沮丧。
    • 有很多 Gradle 插件,但对于我作为 Maven 用户的我来说,它们看起来都像是刚刚搔痒痒的人,没有一个被维护或记录得特别好。我只能推测它们的功能完成程度有多少。我认为 AspectJ Maven 可以毫不费力地更新,因为它有一个坚实的基础。如果只有 Mojohaus 的某个人会解锁 Nick - 或者我或任何人,但我基本上只会说 Maven,而不是真正的 Maven 插件。不过,我想这不是火箭科学。理想情况下,Maven/Gradle 插件将在 AspectJ 中维护。
    • 看起来你是对的 gradle 插件 - 至少当我查看文档时。
    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2012-10-23
    • 2011-05-08
    • 2017-04-07
    • 2016-06-05
    • 2013-01-08
    相关资源
    最近更新 更多