2015-05-08 2 views
6

Я довольно новичок в градиенте и отличном стиле. Вот моя задача, которая генерирует заголовки JNI:Лучший способ определить javah task in gradle

apply plugin: 'java' 
apply plugin: 'application' 

mainClassName = "com.my.example.HelloG" 

task GenerateJniHeaders(dependsOn: 'classes') << { 
    def classpath = "build/classes/main" 
    def nativeIncludes = "src/native/include" 
    "javah -d ${nativeIncludes} -classpath ${classpath} ${mainClassName}".execute() 
} 
classes.finalizedBy GenerateJniHeaders 
build.dependsOn GenerateJniHeaders 

Он работает нормально, но я чувствую, что это немного некрасиво. Как я могу улучшить его? Я ценю любые предложения, особенно те, которые помогают мне удалить переменные, жестко закодированные мной. Я также хотел бы сделать эту задачу более универсальной - теперь она генерирует только заголовок JNI для основного класса, но я хочу запустить ее для всех java-файлов. Кроме того, когда эта задача выходит из строя (например, путь к классу неверен), она не печатает сообщение об ошибке и не создает успешную работу, что вводит в заблуждение.

ответ

12
  1. Gradle имеет тип задачи типа Exec со свойством командной строки, так что было бы более целесообразно использовать:

    task generateJniHeaders(type:Exec) { 
        def classpath = sourceSets.main.output.classesDir 
        def nativeIncludes = "src/native/include"      
        commandLine "javah", "-d", nativeIncludes, "-classpath", classpath, "$mainClassName" 
    
        dependsOn classes 
    } 
    

    Заметьте, что таким образом все, что в этой задаче является конфигурация вместо того, чтобы действовать (если вы не знакомы с жизненным циклом сборки Gradle, то рекомендуемым показанием будет this раздел в руководстве пользователя.

  2. build.dependsOn GenerateJniHeaders следует заменить jar.dependsOn GenerateJniHeaders

  3. classes.finalizedBy не нужен. Обратите внимание, что finalizedBy обычно используется для очистки, поскольку он выполняется, даже если задача не выполняется.

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