2014-02-05 94 views
6

我想將我的.drl文件預編譯爲.class文件,以便它們不必編譯運行時。文檔使得它聽起來像kie-maven-plugin這樣做,但它不會爲我生成任何東西。它編譯規則文件,但不輸出任何內容。有什麼建議麼?你如何預編譯Drools規則?

我使用MVN包命令,我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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>org.kie</groupId> 
    <artifactId>kie-parent-with-dependencies</artifactId> 
    <version>6.0.1.Final</version> 
    <!-- relativePath causes out-of-date problems on hudson slaves --> 
    <!--<relativePath>../droolsjbpm-build-bootstrap/pom.xml</relativePath>--> 
    </parent> 

    <packaging>kjar</packaging> 
    <artifactId>default-kiesession</artifactId> 
    <name>Drools API examples - Default KieSession</name> 

    <dependencies> 
    <dependency> 
     <groupId>org.drools</groupId> 
     <artifactId>drools-compiler</artifactId> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.kie</groupId> 
     <artifactId>kie-maven-plugin</artifactId> 
     <version>6.0.1.Final</version> 
     <extensions>true</extensions> 
     <dependencies> 
      <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>1.6.1</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 

    <repositories> 
    <!-- Bootstrap repository to locate the parent pom when the parent pom has not been build locally. --> 
    <repository> 
     <id>jboss-public-repository-group</id> 
     <name>JBoss Public Repository Group</name> 
     <url>http://repository.jboss.org/nexus/content/groups/public/</url> 
     <layout>default</layout> 
     <releases> 
     <enabled>true</enabled> 
     <updatePolicy>never</updatePolicy> 
     </releases> 
     <snapshots> 
     <enabled>true</enabled> 
     <updatePolicy>daily</updatePolicy> 
     </snapshots> 
    </repository> 
    </repositories> 

    <scm> 
    <connection>scm:git:[email protected]:droolsjbpm/drools.git</connection> 
    <developerConnection>scm:git:[email protected]:droolsjbpm/drools.git</developerConnection> 
    <url>https://github.com/droolsjbpm/drools</url> 
    </scm> 
</project> 
+2

DRL文件不會編譯爲.class文件。它們是在您創建知識庫時編譯的。創建知識庫是應用程序啓動過程中應該發生的事情。 – Steve

+0

我想我是misspoke,我的意思是按照文檔中的描述編譯爲二進制形式:這裏提到的「運行時」要求是如果您將規則部署爲二進制形式(或者作爲KnowledgePackage對象或KnowledgeBase對象等)。這是一個可選功能,可讓您保持運行時非常輕。您可以使用drools編譯器生成「過程外」的規則包,然後將它們部署到運行時系統。這個運行時系統只需要drools-core.jar和knowledge-api來執行。 –

+0

因此,當你建立,它不是在目標目錄中創建一個罐子?這就是它應該做的。它不應該產生任何其他類型的輸出。 – Steve

回答

5

有在6.0.1.Final導致該Maven插件不保存裏面的字節碼編譯錯誤kjar。它在之後得到了修復,因此如果您使用6.0.2-SNAPSHOT(社區)版本或RedHat BRMS 6.0.1.GA(產品)版本,它將起作用。

BZ票:https://bugzilla.redhat.com/show_bug.cgi?id=1063255

提交,修復的bug:https://github.com/droolsjbpm/drools/commit/94b9ccf810100c7ec3f8ed186111720ddb2729d3

僅供參考,會生成正確kjar時,它所包含的罐子每個定義的kbase內kbase.cache文件。這些緩存文件包含編譯的字節碼。

+0

有沒有辦法爲規則生成/保存java文件呢?有時候這些錯誤會引用規則java文件,並且能夠看到它們是有用的和教育的。 –

+1

您可以設置系統屬性:「drools.dump.dir」以指向您要轉儲java文件的根文件夾。請注意,並非所有內容都是以java文件生成的。很多是直接生成字節碼,不會被轉儲。 –

+0

@EdsonTirelli,有沒有一種方法可以從這些Java文件中計算複雜度度量值? 幾年前,我有一個想法,它包含了來自3D形式的流水規則的展示覆雜度度量,類似於CodeCity(http://www.inf.usi.ch/phd/wettel/codecity.html)。 我的想法的簡要說明可以在這裏找到:https://www.linkedin.com/grp/post/1790946-113334735 – Jack

2

它適用於我與kie-maven-plugin 6.1.0.Final,但應該指定打包「kjar」以獲得KIE基本緩存在jar文件中。