java – 简单的protobuf编译与gradle

前端之家收集整理的这篇文章主要介绍了java – 简单的protobuf编译与gradle前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果您正在寻找样品gradle protobuf项目看起来 here.

我很难与毕业生和原型,
我想创建一个简单的gradle项目,将从默认src / main / proto,src / test / proto中获取任何proto文件,并将它们相应地编译到src / main / java,src / test / java,然后将其打包到jar中并发布到本地回购.

不幸的是,我是新来的毕业生,不知道原始项目是如何组成的.

这是我未完成的build.gradle文件

apply plugin: 'java'
apply plugin: "com.google.protobuf"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.protobuf:protobuf-java:3.0.0-beta-1'
}

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            srcDir 'src/main/java'
        }
    }
    test {
        proto {
            srcDir 'src/test/proto'
        }
        proto {
            srcDir 'src/test/java'
        }
    }
}

protobuf {
    // Configure the protoc executable
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
    }
    generateProtoTasks {
        // all() returns the collection of all protoc tasks
        all().each { task ->
            // Here you can configure the task
        }

        // In addition to all(),you may get the task collection by varIoUs
        // criteria:

        // (Java only) returns tasks for a sourceSet
        ofSourceSet('main')

    }
}

运行jar任务后,我们有:

因为你可以看到gradle将测试和主protos都建立在相同的类目录(红色箭头)中,在jar中我可以看到包含的生成的类(同时应该跳过测试).

但主要的问题是我想将编译原始文件直接编译到适当的源目录(蓝色箭头),之后普通的构建将会做正确的事情…毕竟,我们需要这些类在src中使用它们在业务逻辑. ..

所以我们只需要一个任务,将proto编译成适当的src目录…没有了.

src/main/proto to src/main/java
src/test/proto to src/test/java

目前的项目是位于here.请帮助配置这个,我很确定很多人会需要它以后…

解决方法

如果我不误解你的问题,那就很简单了.如果你不想区分你自己和生成的源,你只需要添加generateFileBaseDir就像这样generateProtoTasks.generatedFilesBaseDir =’src’

所以整个构建文件看起来像:

// ...

protobuf {
// Configure the protoc executable
protoc {
    // Download from repositories
    artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
}

generateProtoTasks.generatedFilesBaseDir = 'src' // <- that line 

generateProtoTasks {
    // all() returns the collection of all protoc tasks
    all().each { task ->
        // Here you can configure the task
    }

比你的文件夹看起来像:

> src / main / java / com / vach / tryout / AddressBookProtos.java
> src / main / java / com / vach / tryout / protobuf / Main.java

但:
这可能不是将生成与手工制作的源代码混合在一起的最佳方法.所以我的建议是将源代码生成到一个自己的目录,如generateSources,并将该目录添加到java sourceSet中.构建文件将如下所示:

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            // include self written and generated code
            srcDirs 'src/main/java','generated-sources/main/java'            
        }
    }
    // remove the test configuration - at least in your example you don't have a special test proto file
}

protobuf {
    // Configure the protoc executable
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
    }

    generateProtoTasks.generatedFilesBaseDir = 'generated-sources'

    generateProtoTasks {
        // all() returns the collection of all protoc tasks
        all().each { task ->
            // Here you can configure the task
        }

        // In addition to all(),you may get the task collection by varIoUs
        // criteria:

        // (Java only) returns tasks for a sourceSet
        ofSourceSet('main')

    }   
}

你的目录看起来像这样

> src / main / proto / dtos.proto
> src / main / java / com / vach / tryout / protobuf / Main.java
> generated-sources / main / java / com / vach / tryout / AddressBookProtos.java

一个很好的副作用是您可以忽略git配置中的这个生成源目录.这不是发布生成的源代码的好主意.

猜你在找的Java相关文章