2013-03-03 30 views
1

我正在嘗試開發一個使用項目的資源文件作爲插件的Maven插件。我將suggestion實現到了我的maven-plugin項目中,並且構建得非常好。但是,當我清理&建立我的項目,該項目使用的插件,我得到這個異常:Maven插件開發 - 將當前項目的資源包含到插件 - 「include-project-dependencies」 - 「NoSuchElementException」

「無法執行目標 sample.plugin:上 項目臨時convertproperties(默認):Maven的插件:1.0快照:無法檢索組件配置器 include-project-dependencies配置mojo sample.plugin:maven-plugin:1.0-SNAPSHOT:convertproperties: java.util.NoSuchElementException role:org.codehaus.plexus.component.configurator。 ComponentConfigurator roleHint:include-project-dependencies「

行家 - 插件的POM文件:一個使用Maven的插件我的項目

<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>sample.plugin</groupId> 
    <artifactId>maven-plugin</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>maven-plugin</packaging> 



    <name>maven-plugin</name> 

    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-utils</artifactId> 
      <version>[1.5.0, 1.5.1 ]</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-plugin-api</artifactId> 
      <version>2.0.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.plugin-tools</groupId> 
      <artifactId>maven-plugin-annotations</artifactId> 
      <version>3.2</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.9.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.3</version> 
     </dependency> 
     <dependency> 
      <groupId>taglibs</groupId> 
      <artifactId>standard</artifactId> 
      <version>1.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.json</groupId> 
      <artifactId>json</artifactId> 
      <version>20090211</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>1.4</version> 
      <type>jar</type> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-project</artifactId> 
      <version>2.0.9</version> 
      <exclusions> 
       <exclusion> 
        <artifactId>maven-artifact</artifactId> 
        <groupId>org.apache.maven</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-model</artifactId> 
      <version>2.0.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-core</artifactId> 
      <version>2.0.9</version> 
      <exclusions> 
       <exclusion> 
        <artifactId>maven-artifact</artifactId> 
        <groupId>org.apache.maven</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>maven-repository-metadata</artifactId> 
        <groupId>org.apache.maven</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>wagon-provider-api</artifactId> 
        <groupId>org.apache.maven.wagon</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-artifact</artifactId> 
      <version>3.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-repository-metadata</artifactId> 
      <version>2.0.9</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.wagon</groupId> 
      <artifactId>wagon-provider-api</artifactId> 
      <version>1.0-beta-2</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.codehaus.plexus</groupId> 
        <artifactId>plexus-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <goals> 
           <goal>descriptor</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-plugin-plugin</artifactId> 
        <version>2.3</version> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-javadoc-plugin</artifactId> 
        <version>2.4</version> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 
</project> 

POM文件:

<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>com.mycompany</groupId> 
    <artifactId>temp</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>temp</name> 

    <properties> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.9.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.3</version> 
     </dependency> 

     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>6.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>taglibs</groupId> 
      <artifactId>standard</artifactId> 
      <version>1.1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.1.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.json</groupId> 
      <artifactId>json</artifactId> 
      <version>20090211</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>sample.plugin</groupId> 
       <artifactId>maven-plugin</artifactId> 
       <version>1.0-SNAPSHOT</version> 
       <executions> 
        <execution> 
         <phase>compile</phase> 
         <goals> 
          <goal>convertproperties</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <sourcePath>/lang</sourcePath> 
        <destinationPath>lang_json</destinationPath> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <additionalClasspathElements> 
         <additionalClasspathElement>src\main\webapp\lang</additionalClasspathElement> 
        </additionalClasspathElements> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.1</version> 
       <executions> 
        <execution> 
         <phase>validate</phase> 
         <goals> 
          <goal>copy</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${endorsed.dir}</outputDirectory> 
          <silent>true</silent> 
          <artifactItems> 
           <artifactItem> 
            <groupId>javax</groupId> 
            <artifactId>javaee-endorsed-api</artifactId> 
            <version>6.0</version> 
            <type>jar</type> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
      </resource> 
     </resources> 
    </build> 

</project> 

任何幫助將是非常有用的,謝謝。

回答

1

我發現了一個很好的solvation來使用maven-plugin中的項目資源。 首先,我放棄了使用suggestion。 我的插件的目標是轉換一些資源(.properties)文件並將它們保存到jsp頁面存儲在項目中的位置。所以,第一步是要複製所需的資源文件,並根據需要通過其他Maven的插件叫做「Maven的antrun-插件」通過設置它這樣命名它們:

 <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>CopyLanguagePropertiesAsJson</id> 
        <phase>compile</phase> 
        <configuration> 
         <tasks> 
          <copy file="${basedir}\src\main\resources\x.properties" 
            tofile="${basedir}\src\main\webapp\x\y.z" /> 
         </tasks> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

即運動後,我送打開屬性文件和目標文件到我的插件作爲變量鍵入「文件」,並轉換屬性文件,並存儲到轉換後的文件==> x.properties - > yz 我說打開,因爲maven做的工作完全一樣tihs;在構建時打開爲某些maven插件設置爲變量的文件,併發送那些引用這些文件的對象。 Maven插件可以通過這種方式來更改這些文件。

像這樣:

 <plugin> 
      <groupId>group.id</groupId> 
      <artifactId>artifact-id</artifactId> 
      <version>x.x.x</version> 
      <configuration> 
       <properties> 
        <file>${basedir}\src\main\resources\x.properties</file> 
       </properties> 
       <convertedFiles> 
        <file>${basedir}\src\main\webapp\x\y.z</file> 
       </jsons> 
      </convertedFiles> 
     </plugin> 

而且這些文件所採取的代碼中(類擴展AbstractMojo)我的插件像這樣:

/** 
* @parameter 
*/ 
private File[] properties; 
/** 
* @parameter 
*/ 
private File[] convertedFiles; 

這些都是完全實現對目標的步驟將.properties文件轉換爲另一個文件並存儲在項目的某處。

此外,我遇到了一個異常,它告訴在使用它的項目的構建時執行maven-plugin時未找到某些類。這是由於在當前項目的構建時無法找到Maven插件所需的jar文件所致。這個解決方案是使用名爲「maven-assembly-plugin」的插件,它構建了你的maven插件的罐子,包括你的maven插件使用的依賴jar庫。

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> <!-- this is used for inheritance merges --> 
        <phase>package</phase> <!-- bind to the packaging phase --> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

如果在某些情況下,該插件無法描述編譯你的罐子,也可以通過不包含你的Maven內部的主類引起的:您的Maven的插件的POM文件中的插件的配置-插入。因爲使用這種將所有jar文件編譯成一個的插件的理由是打包來單獨執行當前項目的jar,而不需要運行時需要其他任何類(構建獨立的jar文件)。因此,只需創建一個使用maven-plugin(類繼承AbstractMojo)類的主類並嘗試再次編譯。成功編譯後,您可以刪除主類,它會在沒有主類的情況下成功構建maven插件。

如果這篇文章對某人有用,我會非常高興。

相關問題