web-dev-qa-db-ja.com

Gradle compileJavaがソースファイルからシンボルを見つけられない

私はGradleを初めて使用するので、ここで明らかな何かを見逃している可能性があります。私はプロジェクトの自動ビルドにGradleを使用しています。私はそれらのほとんどに取り組みましたが、1つは私に終わりのない問題を引き起こしています。これは私の会社のため、実際のコードを共有することはできませんが、現実的な疑似コードを提供するために最善を尽くします。

フレックスフロントエンドとJavaバックエンドでWebアプリケーションをコンパイルしようとしています。現在、Javaを含む.warファイルの作成のみに焦点を当てているので、フレックスコンパイルに移ります。次のbuild.gradleスクリプトを実行すると、無数の「シンボルが見つかりません」エラーが発生します。

apply plugin: 'Eclipse'
apply plugin: 'war'

sourceCompatibility = 1.6

repositories {
   mavenCentral()
}

sourceSets.main.Java.srcDir 'src'
sourceSets.main.resources.srcDir 'src'

webAppDirName = "WebContent"

war.archiveName "Gradle_test.war"

dependencies {
    compile fileTree(dir: 'WebContent/WEB-INF/lib', include: '*.jar')
    providedCompile 'org.Apache.Tomcat:catalina:6.0.13'
    providedCompile 'org.Apache.Tomcat:dbcp:6.0.13'
}

発生したエラーの例(偽のパッケージ名とクラス名を使用):

/Users/user/Documents/Eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/RenamedObject.Java:385: cannot find symbol
symbol  : class OtherObject
location: class com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.RenamedObject
    public class InnerClass extends OtherObject implements Indexable<String>, Serializable {

クラスInnerClassは、RenamedObjectクラスとともにRenamedObject.Javaファイル内で宣言されます。見つからないシンボルであるOtherObjectは、.jarからのものではありません。 /Users/user/Documents/Eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/superTypes/OtherObject.Javaに保存されているソースファイルです。オブジェクトはRenamedObject.Javaの上部にインポートされ、特別な設定なしでEclipseを介して適切に構築および実行できます。これらのエラーは、ターミナルからgradle warを実行した後の:compileJavaタスク中に発生します。

このようなサブパッケージからのソースインポートの処理でGradleに問題が発生する理由はありますか?私は何か間違ったことをしていますか?役立つ情報が他にあるかどうかお知らせください。可能であればお知らせします。

編集:私はそれを動作させました。 130件のエラーはすべて、1つの変更で解決されました。完全修飾パッケージ名をextendsのOtherObjectに追加すると、次のようになります。

public class InnerClass extends com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.superTypes.OtherObject implements Indexable<String>, Serializable {

その1つの変更ですべてが機能しましたが、その理由はまだわかりません。これは、プロジェクト内のOtherObjectへの唯一の参照ではなく、内部クラスが別のソースパッケージで定義されたクラスを拡張する唯一の場所でもありません。

14
JorganPubshire

症状

Gradleディストリビューションを使用してビルドを実行できませんでした ' https://services.gradle.org/distributions/gradle-2.8-bin.Zip '

... .... .....

原因:org.gradle.api.internal.tasks.compile.CompilationFailedException:コンパイルに失敗しました。詳細については、コンパイラエラー出力を参照してください。

コンパイラを確認する必要があるGradleビルドレポートJava出力。

出力を確認し、解決できない出力で引用しているクラス名を確認します。

symbol:  class <referenced_classname_here
location: class <parent_classname_here

ソリューション

symbolが解決されないとして言及されているクラスを参照する場合は、完全修飾ドメイン名を提供します。

私の場合、私が宣言したライブラリのクラスを拡張するInner Classを定義したときにこれを確認しました私のbuild.gradleの依存関係として。

P.S:

これに対する解決策は、OPによる質問へのコメントとして既に言及されていることを私は見ました。

Googleに適切なキーワードがなかったため、この質問を見つけることができませんでした。また、視認性をさらに低下させる承認された解決策もありませんでした。

これの結果は、1日が無駄になり、私がこの愚かなハックの解決策を実現する前に、いくつかの髪の毛がむしり取られました:(:(

私は、Sunの下で依存関係の解決にリモートに関連するすべてのものを試して、コードベースの問題ではなかったこの「依存関係の問題」を修正しました。

Gradleチームがこれをできるだけ早く修正して、より多くの人が髪を引き抜くようにしてください。

ところで... Gradleが大好きです。 :)

11
acthota

知識ベースに追加するだけですが、私は同じタイプの問題を抱えていました:

public static class GetNetworkInterfacesCallable implements Java.util.concurrent.Callable<Java.util.Set<Java.net.InetAddress>> {
    public GetNetworkInterfacesCallable(String networkPrefix) {
        this.networkPrefix=networkPrefix;
    }
    @Override public Set<InetAddress> call() throws Exception {
        Thread.currentThread().setName(getClass().getName());
        return null; //myInetAddresses(networkPrefix);
    }
    final String networkPrefix;
}

Gradle 2.9および2.10を使用する。

1
Ray Tayek

今日も同じ問題が発生しました。 Gradleを使用している場合は、クラスがsrc/test/Javaではなくsrc/main/Javaにあることを確認してください。そうでない場合、IDE(たとえばEclipse))はすべてのコンパイルが見つけたと言いますが、あなたがgradleでビルドしようとすると、テストクラスはデフォルトでは含まれていません(そして大丈夫です!)ので、コンパイルされません。

1
Vokail