4

これは私のサンプル プログラムです。mvn を使用してコンパイルすると、コンパイル エラーが発生します。ExpandoMetaClass を使用して静的メソッドを追加しようとしています -

@Singleton
        class ThrowError {
            def parse ()
            {
                println "Anish"
            }

        }
        ThrowError.metaClass.static.getMap = {m_var -> ThrowError.instance.parse(m_var) }

mvn compile を発行しながら、gmaven プラグインを使用してプロジェクトをコンパイルしています。

[ERROR] Failed to execute goal org.codehaus.gmaven:gmaven-plugin:1.2:generateStubs (default) on project TestExpandoMetaClass: startup failed:
[ERROR] /C:/groovy/ThrowError.groovy: 4
: Invalid duplicate class definition of class ThrowError : The source /C:/groovy/ThrowError.groovy contains at least two definitions of the class ThrowError.
**[ERROR] One of the classes is a explicit generated class using the class statement, the other is a class generated from the s
cript body based on the file name. Solutions are to change the file name or to change the class name.**
[ERROR] @ line 4, column 1.
[ERROR] @Singleton
[ERROR] ^
[ERROR]
[ERROR] 1 error
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.gmaven:gmaven-plugin:1.2:generate
Stubs (default) on project TestExpandoMetaClass: startup failed:
/C:/groovyThrowError.groovy: 4: Invali
d duplicate class definition of class ThrowError : The source /groovy/ThrowError.groovy contains at least two definitions of the class ThrowError

これは私の pom.xml エントリ gmaven ビルド プラグイン エントリです

    <project>
............
............
    <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.1</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>java</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.gmaven</groupId>
                    <artifactId>gmaven-plugin</artifactId>
                    <version>1.2</version>
                    <configuration>
                        <providerSelection>1.7</providerSelection>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.codehaus.gmaven.runtime</groupId>
                            <artifactId>gmaven-runtime-1.7</artifactId>
                            <version>1.2</version>
                        </dependency>
                        <dependency>
                            <groupId>org.codehaus.groovy</groupId>
                            <artifactId>groovy-all</artifactId>
                            <version>1.7.2</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <goals>
                                <goal>generateStubs</goal>
                                <goal>compile</goal>
                                <goal>generateTestStubs</goal>
                                <goal>testCompile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
..........
..........
    </project>
4

1 に答える 1

9

ここでの回答は Groovy メーリング リストと同じですが、もう少し説明が必要かもしれません... Groovy にはスクリプトとクラスがあります。クラスは、Java のようにクラス構造を持つすべてのものです。たとえば、クラス B{} はクラス構造であり、クラス B を定義します。スクリプトもクラスですが、そのような構造ではありません。「class B{}; def b = new B()」がある場合、B のクラス構造だけでなく、「def b = new B()」という内容のスクリプトもあります。先ほど言ったように、これもクラスですが、そのクラスの名前は何ですか? 名前は、スクリプトが定義されているファイルの名前によって定義されます (ファイルがない場合は、script1456 のような名前が選択されます)。これで、「class B{}; def b = new B()」という内容の B.groovy を作成できます。B という名前の 1 つのクラスと、まったく同じ名前のスクリプトがあります。これは衝突です。

ファイルに別の名前を付けても問題ありません。

于 2011-11-01T18:18:29.733 に答える