Dominik Sandjaja
Dominik Sandjaja

Reputation: 6486

Avoid parsing project pom.xml when running Drools

this is a follow up question to a question I asked earlier.

I am using Drools 6.1.0.Beta1 in a project with the following (shortened) 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>

For the internal maven, used within KIE/Drools, I have a separate settings.xml, which is configured with the property -Dkie.maven.settings.custom="X:\droolsmaven\settings.xml" The contents of this file are:

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

In that local repository, the respective artifact used later is deployed, which is working, confirmed with a non-maven-project.

Now, when trying running the following code within the maven project which is defined by the above mentioned pom, I get the errors mentioned after this code block:

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();
}
}

The error is:

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

The problem seems to be, that the Maven which is internal to Drools/KIE, also tries to build the complete dependency tree, given by the pom.xml of the project in which KIE runs.

IMHO, this should not be, because the maven artifacts deployed for Drools, used at runtime, are independent from the artifacts used for building the project itself; those are needed at buildtime.

Is this problem just a misconception of how I think Drools should work or is it an actual bug?

Upvotes: 3

Views: 3077

Answers (1)

Dominik Sandjaja
Dominik Sandjaja

Reputation: 6486

Short update:

I talked to one of the Drools developers and that seems to be an actual feature gone slightly wrong. The bug can be found here, the respective question in the mailing list is here and the commit to fix this is here.

Thanks to Mario Fusco for this quick fix!

Upvotes: 4

Related Questions