Я использую ломбок и протобуф одновременно в градле. Это генерирует задачи generateEffectiveLombokConfig
и generateProto
, которые являются независимыми. Тем не менее, задача lombok должна зависеть от задачи protobuf, иначе код, сгенерированный lombok, ссылается на код Java, еще не сгенерированный protoc.
syntax = "proto3";
package my.example.v1;
message Task {
string id = 1;
repeated string names_to_print = 2;
}
package org.example;
import lombok.experimental.UtilityClass;
import my.example.v1.*;
@UtilityClass
public class Worker {
public void work(TaskOuterClass.Task task) {
// do something
}
}
plugins {
id 'java'
id 'io.freefair.lombok' version '6.4.3'
id 'com.google.protobuf' version '0.8.18'
}
group 'org.example'
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.protobuf:protobuf-java:3.20.1"
implementation "com.google.protobuf:protobuf-java-util:3.20.1"
}
Я попытался добавить вывод protobuf как sourceSet, чтобы убедиться, что задача protobuf выполняется первой, но получаю предупреждение:
sourceSets {
main {
java {
srcDir "${projectDir}/build/generated/source/proto/main/java"
}
}
}
предупреждение:
Execution optimizations have been disabled for task ':generateProto' to ensure correctness due to the following reasons:
- Gradle detected a problem with the following location: '/build/generated/source/proto/main'. Reason: Task ':generateEffectiveLombokConfig' uses this output of task ':generateProto' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#implicit_dependency for more details about this problem.
Как я могу убедиться, что все задачи protobuf выполняются до задач lombok?
вы ставите зависимость задачи, как показано ниже
afterEvaluate {
generateEffectiveLombokConfig.mustRunAfter generateProto
}
Executing 'build -m'...
:extractIncludeProto SKIPPED
:extractProto SKIPPED
:generateProto SKIPPED
:generateEffectiveLombokConfig SKIPPED
:compileJava SKIPPED
:processResources SKIPPED
:classes SKIPPED
:jar SKIPPED
:assemble SKIPPED
:generateTestEffectiveLombokConfig SKIPPED
:extractIncludeTestProto SKIPPED
:extractTestProto SKIPPED
:generateTestProto SKIPPED
:compileTestJava SKIPPED
:processTestResources SKIPPED
:testClasses SKIPPED
:test SKIPPED
:check SKIPPED
:build SKIPPED
BUILD SUCCESSFUL in 299ms
Спасибо @PrasadU, который решает проблему. Теперь у меня вопрос вдогонку. Если я также использую
java { withJavadocJar() }
вbuild.gradle
, выполняется задачаdelombok
, которая терпит неудачу, поскольку не может найти файлы, сгенерированные protoc. Я пытался добавитьdelombok.mustRunAfter generateProto
, но это не решает проблему.