Избегайте анализа проекта pom.xml при запуске Drools

Это дополнительный вопрос к вопросу, который я задавал ранее.

Я использую Drools 6.1.0.Beta1 в проекте со следующим (сокращенным) pom.xml:

<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>

    <groupId>de.test.configuration</groupId>
    <artifactId>someTest</artifactId>
    <version>0.7.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>droolsTest</name>

    <parent>
            <groupId>de.test</groupId>
            <artifactId>maven-parent</artifactId>
            <version>0.3</version>
    </parent>

    <dependencies>
            <!-- The Drools rule engine -->
            <dependency>
                    <groupId>org.drools</groupId>
                    <artifactId>drools-core</artifactId>
                    <version>6.1.0.Beta1</version>
            </dependency>
            <dependency>
                    <groupId>org.drools</groupId>
                    <artifactId>drools-compiler</artifactId>
                    <version>6.1.0.Beta1</version>
            </dependency>
            <!-- getting maven artefacts -->
            <dependency>
                    <groupId>org.kie</groupId>
                    <artifactId>kie-ci</artifactId>
                    <version>6.1.0.Beta1</version>
            </dependency>
    </dependencies>
</project>

Для внутреннего maven, используемого в KIE/Drools, у меня есть отдельный файл settings.xml, который настраивается с помощью свойства -Dkie.maven.settings.custom="X:\droolsmaven\settings.xml". Содержимое этого файла:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                  http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <localRepository>x:/droolsmaven/repository</localRepository>

    <profiles>
            <profile>
                    <id>mavenDroolsProfile</id>
                    <activation>
                            <activeByDefault>true</activeByDefault>
                    </activation>

                    <repositories>

                            <repository>
                                    <id>someRepo</id>
                                    <url>http://1.2.3.4</url>
                                    <releases>
                                            <enabled>false</enabled>
                                    </releases>
                                    <snapshots>
                                            <enabled>false</enabled>
                                    </snapshots>
                            </repository>

                            <repository>
                                    <id>central</id>
                                    <url>http://repo1.maven.org/maven2</url>
                                    <releases>
                                    <enabled>false</enabled>
                                    </releases>
                                    <snapshots>
                                            <enabled>false</enabled>
                                    </snapshots>
                            </repository>
                    </repositories>
            </profile>
    </profiles>

</settings>

В этом локальном репозитории развернут соответствующий артефакт, используемый позже, который работает, что подтверждено не-maven-проектом.

Теперь, при попытке запустить следующий код в проекте maven, который определен вышеупомянутым pom, я получаю ошибки, упомянутые после этого блока кода:

public class MainKieTest {

public static void main(String[] args) {
    KieServices ks = KieServices.Factory.get();

    KieRepository repository = ks.getRepository();
    ReleaseId releaseId = ks.newReleaseId("de.test.package", "artifact", "1.0.1");

    KieContainer kieContainer = ks.newKieContainer(releaseId);

    KieScanner kieScanner = ks.newKieScanner(kieContainer);
    kieScanner.scanNow();
}
}

Ошибка:

DEBUG [main] (KieRepositoryImpl.java:92) - KieModule Lookup. ReleaseId de.test.package:artifact:1.0.1 was not in cache, checking classpath DEBUG [main] (KieRepositoryImpl.java:98) - KieModule Lookup. ReleaseId de.test.package:artifact:1.0.1 was not in cache, checking maven repository  WARN [main] (MavenSettings.java:47) - Environment variable M2_HOME is not set DEBUG [main] (Logs.java:390) - Add publisher: com.google.inject.internal.InjectorImpl@5221dfe5

-----[explicit bindings]-------------------------------------------------------
0. ProviderInstanceBinding{key=Key[type=com.google.inject.Injector, annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider<Injector>} [...] lines cut for brevity 198. ConstructorBinding{key=Key[type=org.apache.maven.lifecycle.DefaultSchedules, annotation=[none]], source=ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]], scope=Scopes.SINGLETON} -----[implicit bindings]-------------------------------------------------------
-------------------------------------------------------------------------------

Exception in thread "main" java.lang.RuntimeException: org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM: Could not find artifact de.test:maven-parent:pom:0.3 and 'parent.relativePath' points at wrong local POM @ line 15, column 10

        at org.kie.scanner.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:21)
        at org.kie.scanner.embedder.MavenProjectLoader.loadMavenProject(MavenProjectLoader.java:48)
        at org.kie.scanner.Aether.<init>(Aether.java:44)
        at org.kie.scanner.Aether.getAether(Aether.java:54)
        at org.kie.scanner.MavenRepository.getMavenRepository(MavenRepository.java:53)
        at org.kie.scanner.ArtifactResolver.<init>(ArtifactResolver.java:36)
        at org.kie.scanner.KieRepositoryScannerImpl.getArtifactResolver(KieRepositoryScannerImpl.java:77)
        at org.kie.scanner.KieRepositoryScannerImpl.loadArtifact(KieRepositoryScannerImpl.java:87)
        at org.kie.scanner.KieRepositoryScannerImpl.loadArtifact(KieRepositoryScannerImpl.java:83)
        at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.loadKieModuleFromMavenRepo(KieRepositoryImpl.java:114)
        at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:100)
        at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:77)
        at org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieContainer(KieServicesImpl.java:106)
        at de.test.configuration.kie.MainKieTest.main(MainKieTest.java:40)
Caused by: org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM: Could not find artifact de.test:maven-parent:pom:0.3 and 'parent.relativePath' points at wrong local POM @ line 15, column 10

        at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:363)
        at org.kie.scanner.embedder.MavenEmbedder.buildProjects(MavenEmbedder.java:335)
        at org.kie.scanner.embedder.MavenEmbedder.readProjects(MavenEmbedder.java:319)
        at org.kie.scanner.embedder.MavenEmbedder.readProject(MavenEmbedder.java:312)
        at org.kie.scanner.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:19)
        ... 13 more

Похоже, проблема в том, что Maven, который является внутренним для Drools/KIE, также пытается построить полное дерево зависимостей, предоставленное pom.xml проекта, в котором работает KIE.

ИМХО, этого не должно быть, потому что артефакты maven, развернутые для Drools, используемые во время выполнения, не зависят от артефактов, используемых для построения самого проекта; те необходимы во время сборки.

Эта проблема - просто неправильное представление о том, как я думаю, что Drools должен работать, или это реальная ошибка?

1 ответ

Краткое обновление:

Я поговорил с одним из разработчиков Drools, и это, похоже, реальная функция, которая пошла немного не так. Ошибка может быть найдена здесь, соответствующий вопрос в списке рассылки здесь, и коммит, чтобы исправить это здесь.

Спасибо Марио Фуско за это быстрое решение!

Другие вопросы по тегам