3

当我跑

mvn clean install

对于我的 Maven 模块,它编译得很好。没有问题。但是当我在 IntelliJ 中打开 pom.xml 文件并选择 Build -> Build module 时,我会遇到以下问题:

Information:javac 1.8.0_144 was used to compile java sources
Information:Module "mymodule" was fully rebuilt due to project configuration/dependencies changes
Information:09.10.2017 21:16 - Compilation completed with 3 errors and 3 warnings in 23s 991ms
C:\somepath\mymodule\pom.xml
Error:Error:osgi: [mymodule] Exception: java.lang.ClassNotFoundException: org.apache.sling.bnd.models.ModelsScannerPlugin not found, parent:  java.net.URLClassLoader@29453f44 urls:[] exception:java.lang.ClassNotFoundException: org.apache.sling.bnd.models.ModelsScannerPlugin
Error:Error:osgi: [mymodule] Failed to load plugin org.apache.sling.bnd.models.ModelsScannerPlugin;generatePackagesHeader=true, error: java.lang.ClassNotFoundException: org.apache.sling.bnd.models.ModelsScannerPlugin not found, parent:  java.net.URLClassLoader@29453f44 urls:[] exception:java.lang.ClassNotFoundException: org.apache.sling.bnd.models.ModelsScannerPlugin 
Error:Error:osgi: [mymodule] Cannot load the plugin org.apache.sling.bnd.models.ModelsScannerPlugin

这是一个带有 AEM 代码的模块,它使用 maven-sling-plugin。它适用于项目中的其他开发人员。因为它在直接从 maven 执行时有效,所以我试图了解 IntelliJ 在后台执行的操作。但实际上,我的问题是那些编译问题。

从我发现 IntelliJ 在 Build 完成时不会调用 maven 。有什么想法可以找到从 IntelliJ 运行和直接从 Maven 运行之间的差异吗?

4

2 回答 2

1

IntelliJ 构建错误截图

这里发生的是使用当前的 ClassLoader 找不到 ModelScanner 插件。造成这种情况的原因可能是您使用的是IntelliJ IDEA Ultimate,它带有一个已预先安装的 OSGI 插件,名为 'Osmorc'。如果此 OSGI 插件处于活动状态,它将确定用于构建 OSGI 相关项目的类加载器。

因此,只需在 IntelliJ 中取消激活此 Osmorc 插件即可让您的构建从项目 POM.xml 文件中的 maven-bundle-plugin 配置中提到的 ModelScannerPlugin 恢复到类加载器,这应该可以解决问题。

IntelliJ Osmorc 插件

如果这仍然导致类似的 Maven 构建错误,请确保将 Maven 依赖项“org.apache.sling.bnd.model”添加到 POM.xml 文件中的 maven-bundle-plugin。

<!-- Apache Felix Bundle Plugin -->
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.3.0</version>
    <inherited>true</inherited>
    <extensions>true</extensions>
    <executions>
        <!-- Configure extra execution of 'manifest' in process-classes phase to make sure SCR metadata is generated before unit test runs -->
        <execution>
            <id>scr-metadata</id>
            <goals>
                <goal>manifest</goal>
            </goals>
            <configuration>
                <supportIncrementalBuild>true</supportIncrementalBuild>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <exportScr>true</exportScr>
        <instructions>
            <!-- Enable processing of OSGI DS component annotations -->
            <_dsannotations>*</_dsannotations>
            <!-- Enable processing of OSGI metatype annotations -->
            <_metatypeannotations>*</_metatypeannotations>
            <_plugin>org.apache.sling.bnd.models.ModelsScannerPlugin;generatePackagesHeader=true</_plugin>
        </instructions>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.bnd.models</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</plugin>
于 2019-07-24T06:57:28.427 回答
0

你能检查你的核心pom文件吗?它应该包含这样的插件部分:

<plugin> <!-- Enable registration of Sling Models classes via bnd plugin --> org.apache.sling.bnd.models.ModelsScannerPlugin, <!-- Allow the processing of SCR annotations via a bnd plugin --> org.apache.felix.scrplugin.bnd.SCRDescriptorBndPlugin;destdir=${project.build.outputDirectory} </plugin>

但是如果您使用 aem 原型创建了一个项目,则标签看起来像' <_plugin>

于 2019-06-26T11:28:37.413 回答