4

スタンドアロンで実行すると正常に動作する Maven プラグインを作成しました。プラグイン ソース コード内にカスタム XML リソース ファイルがいくつかあります。これらは、テスト時に表示され、プラグインからアクセスできます (以下のプラグイン POM)。だから私はプラグインをインストールし、すべてがうまくいっています。

次に、新しくインストールしたプラグインを参照する新しいプロジェクトを作成します (以下のプロジェクト POM)。プラグイン プロジェクト内に埋め込まれたものと同様のカスタム XML リソース ファイルがいくつかあります。

プロジェクトの構造は次のとおりです。

tester
|   pom.xml
|
+---src
|   +---main
|   |   +---java
|   |   |   \---[BLAH}
|   |   |
|   |   \---resources
|   |           tester-catalog-env.xml
|   |
|   \---test
|       \---java
|           \---[BLAH]

プラグイン内には、次のメソッドがあります。

    public TesterProcessCatalog getTesterProcessCatalog(Properties properties) throws TesterDataSourceException {
        try {
            InputStream in = getClass().getClass().getResourceAsStream("tester-catalog-env.xml");
            Reader reader = ReaderFactory.newXmlReader(in);
            return readCatalog(reader);

        } catch (IOException e) {
            throw new TesterDataSourceException("Error reading catalog", e);
        }
    }

この線:

InputStream in = getClass().getClass().getResourceAsStream("tester-catalog-env.xml");

mvn tester:testリソースがクラスパスに存在することがわかりますが、(プラグインmojoで定義されているように)プロジェクトから実行するとnullが返されます。私は次のことを試しました

InputStream in = getClass().getClass().getResourceAsStream("/tester-catalog-env.xml");

また、 を返しますnull

リソース ファイルをプラグイン リソース ディレクトリにコピーして実行すると、問題なく動作します。

最終的に私が達成しようとしているのは、プロジェクトのリソース ディレクトリ (つまり、tester-catalog-xxx.xml - xxx はユーザーが作成した新しいファイル) に複数の構成ファイルを作成することmvn tester:test -DprocessCatalog=env2です。 tester-catalog-env2.xml という名前のファイルが読み込まれます。

私が間違っていることについてのアイデアはありますか?

Maven情報

Apache Maven 3.0.4 (r1232337; 2012-01-17 10:44:56+0200)
Maven ホーム: C:\Apps\apache-maven-3.0.4
Java バージョン: 1.6.0_35、ベンダー: Sun Microsystems Inc.
Javaホーム: C:\java\jdk1.6.0_35\jre
デフォルトのロケール: en_GB、プラットフォームのエンコード: Cp1252
OS 名: "windows xp"、バージョン: "5.1"、アーキテクチャ: "x86"、ファミリ: "windows"

プラグイン 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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.testing.tester.maven</groupId>
    <artifactId>tester</artifactId>
    <packaging>maven-plugin</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>tester Maven Mojo</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-component-annotations</artifactId>
            <version>1.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.6</version>
            <scope>system</scope>
            <systemPath>C:\java\jdk1.6.0_35\lib\tools.jar</systemPath>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.brsanthu</groupId>
            <artifactId>data-exporter</artifactId>
            <version>1.0.0</version>
            <!-- http://code.google.com/p/data-exporter/wiki/UserGuide -->
            <!-- mvn install:install-file -DgroupId=com.brsanthu -DartifactId=data-exporter -Dversion=1.0.0 -Dpackaging=jar -Dfile=http://data-exporter.googlecode.com/files/data-exporter-1.0.0.jar-->
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.plexus</groupId>
                <artifactId>plexus-component-metadata</artifactId>
                <version>1.5.5</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate-metadata</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </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.testing.tester</groupId>
  <artifactId>tester</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>tester</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
      <dependency>
          <groupId>com.testing.tester.maven</groupId>
          <artifactId>tester</artifactId>
          <version>1.0-SNAPSHOT</version>
      </dependency>
  </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.testing.tester.maven</groupId>
                <artifactId>tester</artifactId>
                <version>1.0-SNAPSHOT</version>
            </plugin>
        </plugins>
    </build>
</project>
4

2 に答える 2

4

私は実用的な解決策を見つけました。この投稿では、必要な手順について詳しく説明します。

基本的に、次のクラスをプラグインに追加しました (元の投稿で LOGGER への参照を削除しました)。

    /**
     * A custom ComponentConfigurator which adds the project's runtime classpath elements
     * to the
     *
     * @author Brian Jackson
     * @since Aug 1, 2008 3:04:17 PM
     *
     * @plexus.component role="org.codehaus.plexus.component.configurator.ComponentConfigurator"
     *                   role-hint="include-project-dependencies"
     * @plexus.requirement role="org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup"
     *                   role-hint="default"
     */
    public class IncludeProjectDependenciesComponentConfigurator extends AbstractComponentConfigurator { 

        public void configureComponent( Object component, PlexusConfiguration configuration,
                                        ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm,
                                        ConfigurationListener listener )
            throws ComponentConfigurationException {

            addProjectDependenciesToClassRealm(expressionEvaluator, containerRealm);

            converterLookup.registerConverter( new ClassRealmConverter( containerRealm ) );

            ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter();

            converter.processConfiguration( converterLookup, component, containerRealm.getClassLoader(), configuration,
                                            expressionEvaluator, listener );
        }

        private void addProjectDependenciesToClassRealm(ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm) throws ComponentConfigurationException {
            List<String> runtimeClasspathElements;
            try {
                //noinspection unchecked
                runtimeClasspathElements = (List<String>) expressionEvaluator.evaluate("${project.runtimeClasspathElements}");
            } catch (ExpressionEvaluationException e) {
                throw new ComponentConfigurationException("There was a problem evaluating: ${project.runtimeClasspathElements}", e);
            }

            // Add the project dependencies to the ClassRealm
            final URL[] urls = buildURLs(runtimeClasspathElements);
            for (URL url : urls) {
                containerRealm.addConstituent(url);
            }
        }

        private URL[] buildURLs(List<String> runtimeClasspathElements) throws ComponentConfigurationException {
            // Add the projects classes and dependencies
            List<URL> urls = new ArrayList<URL>(runtimeClasspathElements.size());
            for (String element : runtimeClasspathElements) {
                try {
                    final URL url = new File(element).toURI().toURL();
                    urls.add(url);
                } catch (MalformedURLException e) {
                    throw new ComponentConfigurationException("Unable to access project dependency: " + element, e);
                }
            }

            // Add the plugin's dependencies (so Trove stuff works if Trove isn't on
            return urls.toArray(new URL[urls.size()]);
        }

    }

その後追加

@configurator include-project-dependencies

私のモジョ宣言に、それはうまくいきます!

于 2012-12-13T09:55:17.843 に答える
1

testerProcessCatalog ファイルを Maven プラグイン プロパティとして指定する必要があると思います。

/**
 * @parameter expression="${tester.testerProcessCatalog}"
 * default-value="${basedir}/src/main/resources/tester-catalog-env.xml"
 */
private File testerProcessCatalog; 

注: Javadoc アノテーションの代わりに Java アノテーションを使用できるようになったことをどこかで読みましたが、まだ試していません。

于 2012-12-13T09:08:58.097 に答える