2015-03-22 3 views
4

У меня есть следующий класс в SRC/главная/Java/COM/компании/проекта/Config.java:Фильтрация класса Java с Gradle

public class Config { 

    public static final boolean DEBUG = true; 

    ... 
} 

так, что в каком-то другом классе я могу сделать следующее, зная, что Java компилятор удалит заявление, если(), если она принимает значение ложь:

import static com.company.project.Config.DEBUG 

if (DEBUG) { 
    client.sendMessage("something"); 

    log.debug("something"); 
} 

в Gradle, что это лучший способ фильтрации и изменить значение DEBUG в Config.java во время компиляции, не изменяя оригинал файл?

До сих пор я думал:

  1. Создание задачи updateDebug (тип: Копировать), который фильтрует DEBUG и копирует Config.java во временную папку
  2. Исключить из sourceSets оригинальный Config.java файл и включают в себя временный один
  3. Сделать compileJava.dependsOn updateDebug

ли выше возможно? Есть ли лучший способ?

+1

нет гарантии, что компилятор разделит всегда ложную ветвь. – Zielu

+0

http://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in-gradle-usable-in-java? –

+0

@Zielu http://stackoverflow.com/questions/1344270/java-preprocessor – Mirco

ответ

1

Чтобы ответить на мой собственный вопрос, учитывая класс SRC/главная/Java/COM/компании/проекта/Config.java:

public class Config { 

    public static final boolean DEBUG = true; 

    ... 
} 

это код Gradle я придумал:

// 
// Command line: gradle war -Production 
// 
boolean production = hasProperty("roduction"); 

// 
// Import java regex 
// 
import java.util.regex.* 

// 
// Change Config.java DEBUG value based on the build type 
// 
String filterDebugHelper(String line) { 
    Pattern pattern = Pattern.compile("(boolean\\s+DEBUG\\s*=\\s*)(true|false)(\\s*;)"); 
    Matcher matcher = pattern.matcher(line); 
    if (matcher.find()) { 
    line = matcher.replaceFirst("\$1"+(production? "false": "true")+"\$3"); 
    } 

    return (line); 
} 

// 
// Filter Config.java and inizialize 'DEBUG' according to the current build type 
// 
task filterDebug(type: Copy) { 
    from ("${projectDir}/src/main/java/com/company/project") { 
    include "Config.java" 

    filter { String line -> filterDebugHelper(line) } 
    } 
    into "${buildDir}/tmp/filterJava" 
} 

// 
// Remove from compilation the original Config.java and add the filtered one 
// 
sourceSets { 
    main { 
    java { 
     srcDirs ("${projectDir}/src/main/java", "${buildDir}/tmp/filterJava") 
     exclude ("com/company/project/Config.java") 
    } 

    resources { 
    } 
    } 
} 

// 
// Execute 'filterDebug' task before compiling 
// 
compileJava { 
    dependsOn filterDebug 
} 

Это, по общему признанию, немного взломанный, но он работает, и он дает мне наиболее эффективное решение, в то же время контролируя разработку/производство с одной точки входа (build.gradle).

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