0

別のプロジェクトでこの問題が発生したので、問題を検証するためのテストプロジェクトを作成しました。Android Studio Gradleが過渡的な依存関係を使用していない

  1. Androidスタジオ3.0を開くと、私は新しい基本プロジェクトを作成しました。そのメインモジュールはappと呼ばれていました。
  2. libraryoneというライブラリモジュールを追加しました。
  3. libraryoneでは、Gsonに依存関係を追加し、Gsonを使用して1つの静的メソッドを持つ1つのクラスを追加しました。
  4. appでは、libraryoneに依存関係を追加しました。私はそれを平らで、そしてtransitive = trueと同様にテストしました。インターネットがそうすることが漠然としているように思われたので、助けになるかもしれません。 (そうではありませんでした)
  5. MainActivityには、libraryoneのクラスを使用しました。これは(私がtransitive = falseを設定していない限り)機能しました。
  6. しかし、私はMainActivityからGsonを参照することはできません。 Androidスタジオだけでなく、コマンドラインGradleからも、 "シンボル 'Gson'のエラーを解決できません。これは、プロジェクトのグループ全体で共通の依存関係をすべて繰り返す必要があり、クラスが出力に含まれていることを意味するため、珍しくて悪化します。確かに私は何か間違っているか、これはバグですか?次のように

私のコードは次のとおり

appで)MainActivity.java

package com.erhannis.test.dependencytest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import com.erhannis.test.libraryone.LibClass; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String s = LibClass.convert(new Object()); 
     System.out.println("out: " + s); 

     new com.google.gson.Gson(); // This line gives a compile-time error: "Cannot resolve symbol 'Gson'" 
    } 
} 

LibClass.java(libraryoneで)

package com.erhannis.test.libraryone; 

import com.google.gson.Gson; 

public class LibClass { 
    public static String convert(Object o) { 
     Gson gson = new Gson(); 
     return gson.toJson(o); 
    } 
} 

build.gradle(app

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 26 
    defaultConfig { 
     applicationId "com.erhannis.test.dependencytest" 
     minSdkVersion 18 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 

    implementation 'com.android.support:appcompat-v7:26.1.0' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 

    implementation (project(path: ':libraryone')) 
} 

build.gradle(libraryone

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 26 
    defaultConfig { 
     minSdkVersion 18 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 

    implementation 'com.android.support:appcompat-v7:26.1.0' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 

    implementation 'com.google.code.gson:gson:2.8.2' 
} 

答えて

1

私はそれが理由implementationのだと思います。代わりにimplementation変更のapiを試してみてください。

implementation (project(path: ':libraryone')) 

に:

api project(path: ':libraryone') 

と:

implementation 'com.google.code.gson:gson:2.8.2' 

に:

api 'com.google.code.gson:gson:2.8.2' 
+0

これは私にとっては役に立ちません。どのように動作するのですか教えてください。 – Kuls

+0

@KulsDroidあなたはそれらの違いがあります[ここ](https://blog.mindorks.com/implementation-vs-api-in-gradle-3-0-494c817a6fa) –

1

あなたが使用している:

implementation (project(path: ':libraryone')) 
implementation 'com.google.code.gson:gson:2.8.2' 

チェックofficial doc

あなたのモジュールがimplementation依存関係を設定し

、それはGradleのモジュールがコンパイル時に他のモジュールへの依存関係をリークしたくないことを知らせるています。つまり、依存関係は実行時にのみ他のモジュールで使用できます。

ここでは、非常にgood blogが見つかります。

関連する問題