2016-04-20 2 views
3

Итак, у меня есть XJC javaExec, который вращается как верх, но IntelliJ не распознает сгенерированный вывод, несмотря на то, что он помечает generated-src/java как таковой. Нужно ли мне настроить плагин идеи или что-то еще?Как я могу получить IntelliJ для распознавания источников сгенерированных источников?

Примечание: сам подключаемый модуль загружается в подпроекты от корня build.gradle.

XJC Проект:

description = "Generates sources and compiles them into a Jar for $project" 

configurations { xjc } 
dependencies { 
    xjc 'org.glassfish.jaxb:jaxb-xjc:2.2.11' 
    xjc 'org.glassfish.jaxb:jaxb-runtime:2.2.11' 
} 

task xjc (type:JavaExec) { 

    doFirst{ 
     File generatedSrcDir = file("$buildDir/generated-src/java") 
     if (!generatedSrcDir.exists()) { 
      generatedSrcDir.mkdirs() 
     } 
    } 

    main = "com.sun.tools.xjc.XJCFacade" 
    classpath configurations.xjc 

    def argsList = [ 
      "-mark-generated", 
      "-no-header", 
      "-verbose", // or -quiet or nothing for default. 
      "-target", "2.1", 
      "-encoding", "UTF-8", 
      "-d", "$buildDir/generated-src/java", 
      "-catalog","$projectDir/src/main/resources/commons-gradle.cat", 
      file("$projectDir/src/main/resources/v1/") ] 

    args argsList 
    inputs.files files(file("$projectDir/src/main/resources/v1/")) 
    outputs.files files(file("$buildDir/generated-src/java"),file("$buildDir/classes")) 

} 

compileJava { 
    dependsOn xjc 
    source "${buildDir}/generated-src" 
} 

В проекте, который зависит от этого одного я просто:

compile project(":path:to:schemas:the-test-schema") 

Я попытался:

idea { 
    module { 

     def buildDir = file("$buildDir") 
     def generatedDir = file("$buildDir/generated-src") 
     def listOfDirs = [] 

     buildDir.eachDir { file -> 
      if (file.name != buildDir.name && file.name != generatedDir.name) 
      listOfDirs.add(file) 
     } 

     excludeDirs = listOfDirs.toArray() 

     generatedSourceDirs += file("$buildDir/generated-src/java") 
     scopes.COMPILE.plus += [ configurations.xjc ] 
    } 
} 
+0

вы можете попробовать добавить идею Gradle плагина и возможно манипулировать классы проекта, что идея использует? – RaGe

+0

Мой плохой. Это добавляется в subProjects. – user447607

+0

Я чувствую ошибку. ... может быть, больше одного. Вот почему. В сгенерированной документации я могу найти ссылку на другие элементы, но не сгенерироватьSourceDirs. Если я использую sourceDirs + = ..., он отлично работает. Подозреваю, что каким-то образом сгенерированныйSourceDirs не попал в сборку. – user447607

ответ

3

Я буду укажите решение Даниэля Декани, from a Gradle discussion thread actually linking to this question. Цитирование:

apply plugin: "idea" 
... 
sourceSets.main.java.srcDir new File(buildDir, 'generated/javacc') 
idea { 
    module { 
     // Marks the already(!) added srcDir as "generated" 
     generatedSourceDirs += file('build/generated/javacc') 
    } 
} 

Хорошо работает для меня.

0

Код this ответа, переписанный с использованием Kotlin DSL, будет выглядеть следующим образом:

plugins { 
    idea 
} 

val generatedSourcesPath = file("out/production/classes/generated") 

java.sourceSets["main"].java.srcDir(generatedSourcesPath) 

idea { 
    module { 
     generatedSourceDirs.add(generatedSourcesPath) 
    } 
} 
+0

Что такое Котлин? Шутка - несколько. Многие люди не знают Котлина. – user447607

+0

@ user447607 ну это язык программирования :) (https://kotlinlang.org/). И Gradle предлагает DSL на основе Kotlin наравне с Groovy с версии 3.0: https://github.com/gradle/kotlin-dsl – jihor

Смежные вопросы