Gradleプロジェクトがあり、その中でdagger2.0を使用したいと思います。 IntelliJとgradleを構成してファイルを生成し、IntelliJにそれらを検出させる方法がわかりませんか?
私のbuild.gradleファイルは次のようになります:
apply plugin: 'Java'
apply plugin: 'idea'
version = '1.0'
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.12'
compile 'org.slf4j:slf4j-simple:1.7.12'
compile 'commons-configuration:commons-configuration:1.10'
compile 'commons-collections:commons-collections:3.2.1'
compile 'com.google.dagger:dagger:2.0'
compile 'com.google.dagger:dagger-compiler:2.0:jar-with-dependencies'
compile 'com.pi4j:pi4j-distribution:1.1-SNAPSHOT'
}
私のアプリケーションのビルドディレクトリには、Daggerが作成するコンポーネントであるファイルDaggerXmlConfigurationComponent
が存在します。しかし、クラスが見つからないため、IntelliJでは使用できません。
これはAndroidアプリケーションではなく、RaspberryPi用のアプリケーションです。
IntelliJの注釈処理を手動で有効にする必要があります。[設定...]→[ビルド、実行、展開]→[コンパイラ]→[注釈プロセッサ]で、[注釈処理を有効にする]と[プロジェクトクラスパスからプロセッサを取得する]をオンにします。
私は解決策を見つけました。
https://github.com/tbroyer/gradle-apt-plugin
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "net.ltgt.gradle:gradle-apt-plugin:0.3"
}
}
apply plugin: "net.ltgt.apt"
dependecies {
apt 'com.google.dagger:dagger-compiler:2.0.1'
compile 'com.google.dagger:dagger:2.0.1'
}
さらに、Intellijを使用している場合は、次の構成をお勧めします。
IntelliJでGradle統合を使用する場合IDEAただし、アイデアタスクではなく、手動で注釈処理を有効にする必要があります:[設定...]→[ビルド、実行、展開]→[コンパイラ]→[注釈プロセッサ]、 [アノテーション処理を有効にする]と[プロジェクトのクラスパスからプロセッサを取得する]をオンにします。Gradleの動作と生成されたファイルの動作を模倣するために、本番ディレクトリとテストソースディレクトリをbuild/generate/source/apt/mainおよびbuild/generate/source/apt/testに構成できます。モジュールコンテンツルート。ビルドディレクトリ全体からExcludeを削除し、generated/source/apt/mainディレクトリをソースとしてマークする必要もありました。
私もプラグインを動作させることができなかったので、Stefanの応答に基づいて、次のように動作しましたが、迷惑なことにIntelliJは、以前は存在しなかったグループモジュールを作成しているようです。何がこれを引き起こしているのか誰かが何か考えを持っているなら、私は本当にこれを修正したいと思います。
apply plugin: 'Java'
apply plugin: 'idea'
configurations {
compileDagger
}
def genPath = new File(buildDir,"generated/source/apt/main" )
task createGenPath << {
if(!genPath.exists()){
genPath.mkdirs()
}
}
compileJava.dependsOn(createGenPath)
compileJava {
source += genPath
classpath += configurations.compileDagger
options.compilerArgs += ['-s', genPath]
}
idea.module {
sourceDirs += genPath
}
dependencies {
compileDagger "com.google.dagger:dagger-compiler:${dagger2Version}"
compile "com.google.dagger:dagger:${dagger2Version}"
}
私が知っている最も簡単な方法は、 apt-ideaプラグイン を使用することです。
build.gradle
ファイルでプラグインをアクティブ化するだけです。
plugins {
id 'Java'
id 'net.ltgt.apt-idea' version "0.15"
}
次に、注釈プロセッサをannotationProcessor
構成に追加します。
final DAGGER_VER = '2.16'
dependencies {
implementation "com.google.dagger:dagger:${DAGGER_VER}"
annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}"
}
GitHubで非常に単純なテストプロジェクトを作成しました: ex.dagger
(IntelliJ 2018.1.4、Gradle 4.7を使用)
私は次の解決策を完成させました(そしてそれは送信されたすべての回答の中で最も単純なもののようです):
apply plugin: 'Java'
apply plugin: 'idea'
def generatedMain = new File(buildDir, "generated/main")
compileJava {
doFirst {
generatedMain.mkdirs()
}
options.compilerArgs += ['-s', generatedMain]
}
idea.module.sourceDirs += generatedMain
dependencies {
compileOnly 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
}
私の場合、問題はIDEA短剣で生成されたファイル用に別のモジュールを作成することでした。File -> Project Structure -> Modules
に移動し、projectname_dagger
モジュールを削除する必要がありました(赤をクリックして)マイナス)、生成されたソースフォルダをprojectname_main
をクリックして選択し、Add Content Root
モジュールに追加します。
何らかの理由で、Daggerのファイルを削除し、プロジェクト内の重複ファイルに関するエラーが発生したため、IDEA再生成する必要がありました。
これで機能し、アノテーションプロセッサがオフになっているイベント(Androidプロジェクト)では主に重要である必要があると思います)。
既存のプラグインに問題があったので、build.gradle
に以下を追加しました。
def daggerVersion = "2.4"
// APT >>
def genPath = new File(buildDir,"generated/Java/APT" )
task createGenPath << {
if(!genPath.exists()){
genPath.mkdirs()
}
}
compileJava.dependsOn(createGenPath)
compileJava {
options.compilerArgs << '-s' << genPath
}
// APT <<
dependencies {
compile "com.google.dagger:dagger:$daggerVersion"
compile "com.google.dagger:dagger-compiler:$daggerVersion"
}
// APT IDEA >>
idea.module {
sourceDirs += genPath
// maybe add to generatedSourceDirs
iml {
withXml {
File ideaCompilerXml = project.file('.idea/compiler.xml')
if (ideaCompilerXml.isFile()) {
Node parsedProjectXml = (new XmlParser()).parse(ideaCompilerXml)
updateIdeaCompilerConfiguration(parsedProjectXml)
ideaCompilerXml.withWriter { writer ->
XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(writer))
nodePrinter.setPreserveWhitespace(true)
nodePrinter.print(parsedProjectXml)
}
}
}
}
}
static void updateIdeaCompilerConfiguration( Node projectConfiguration) { //actually resets APT
Object compilerConfiguration = projectConfiguration.component.find { it.@name == 'CompilerConfiguration' }
compilerConfiguration.annotationProcessing.replaceNode{
annotationProcessing() {
profile(default: 'true', name: 'Default', enabled: 'true') {
sourceOutputDir(name: '')
sourceTestOutputDir(name: '')
outputRelativeToContentRoot(value: 'true')
processorPath(useClasspath: 'true')
}
}
}
}
// APT IDEA <<
Net.ltgt.aptバージョン以降0.11
(2018年2月)プラグインを適用するだけですnet.ltgt.apt-idea
からbuild.gradle
:
plugins {
id "net.ltgt.apt-idea" version "0.18"
}
apply plugin: 'idea'
apply plugin: 'Java'
dependencies {
compile "com.google.dagger:dagger:2.17"
annotationProcessor "com.google.dagger:dagger-compiler:2.17"
}