8000 GitHub - ascopes/protobuf-maven-plugin: Modern Protobuf integration for Maven, with support for binary and JAR protoc plugins.
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

ascopes/protobuf-maven-plugin

Java 11+ Maven 3.8 GitHub License Build Status Coverage Maven Central Documentation GitHub Release Date

logo

protobuf-maven-plugin

A scratch-built, modern Maven plugin for seamless protoc integration. Provides support for native and JVM-based protoc plugins, as well as automatic dependency resolution and incremental code generation.

Note

Full documentation with usage examples can be found within the plugin documentation, and examples are present in the integration tests.

Quick start

Basic code generation

Getting started is very simple. The following will compile any sources that are found in src/main/protobuf to Java classes and pop them in target/generated-sources where Maven will automatically discover them and compile them to Java bytecode.

<plugin>
  <groupId>io.github.ascopes</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>

  <configuration>
    <protocVersion>${protobuf-java.version}</protocVersion>
  </configuration>

  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Tip

Any *.proto files that are discovered in project dependencies will be made available to protoc, so you can import them in exactly the same way you would with Java classes

Other language support

Other language generation targets are also available. This plugin provides support for generating all the languages that protoc supports out of the box, including Kotlin, Python, Python typeshed stubs, Ruby, PHP, C#, C++, and Rust.

The following will generate Java classes and corresponding Kotlin wrappers:

<plugin>
  <groupId>io.github.ascopes</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>

  <configuration>
    <kotlinEnabled>true</kotlinEnabled>
    <protocVersion>${protobuf-java.version}</protocVersion>
  </configuration>

  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Dependencies

Native Maven dependency management is supported out of the box, allowing you to use Maven as an artifact registry for bundles of Proto files seamlessly.

<project>
  ...

  <dependencies>
    <dependency>
      <groupId>org.example.protos</groupId>
      <artifactId>user-protos</artifactId>
      <version>1.2.3</version>
      <type>zip</type>
    </dependency>
  </dependencies>

  <plugins>
    <plugin>
      <groupId>io.github.ascopes</groupId>
      <artifactId>protobuf-maven-plugin</artifactId>

      <configuration>
        <protocVersion>${protobuf-java.version}</protocVersion>
      </configuration>

      <executions>
        <execution>
          <goals>
            <goal>generate</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</project>

Plugins

The following snippet will compile any protobuf sources in src/main/protobuf to Java source code, and then proceed to generate gRPC wrappers and Reactor gRPC wrappers.

<plugin>
  <groupId>io.github.ascopes</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>

  <configuration>
    <protocVersion>${protobuf-java.version}</protocVersion>

    <!-- Vanilla protoc plugins - these are platform specific executables
         just like protoc is. -->
    <binaryMavenPlugins>
      <binaryMavenPlugin>
        <groupId>io.grpc</groupId>
        <artifactId>protoc-gen-grpc-java</artifactId>
        <version>${grpc.version}</version>
      </binaryMavenPlugin>
    </binaryMavenPlugins>

    <!-- JVM plugins are distributed as JARs rather than native system
         executables. The protobuf-maven-plugin will automatically bootstrap
         them for you. -->
    <jvmMavenPlugins>
      <jvmMavenPlugin>
        <groupId>com.salesforce.servicelibs</groupId>
        <artifactId>reactor-grpc</artifactId>
        <version>${reactor-grpc.version}</version>
      </jvmMavenPlugin>
    </jvmMavenPlugins>
  </configuration>

  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Feature matrix and project roadmap

  • βœ… - actively supported/available
  • πŸ’­ - not supported, but open for discussion
  • ❌ - not supported, nor planned

Supported platform versions

Feature Support
Maven 3.8 Support βœ…
Maven 3.9 Support βœ…
Maven 4.x Support βœ…
Java 11 Support βœ…
Java 17 Support βœ…
Java 21 Support βœ…
Java 24 Support βœ…
Linux x86_64 βœ…
Linux ARM64 βœ…
macOS x86_64 βœ…
macOS ARM64 βœ…
Windows x86_64 βœ…
Android Termux βœ…*

Note

Maven integration is tested with the newest bugfix of each minor version that is listed (e.g. 3.9.9).

Tip

* Only supports using protoc from the system $PATH at this time.

Languages and frameworks

Feature Support
Java βœ…
Kotlin βœ… (JVM shims out of the box, multiplatform via third-party protoc plugins)
C# βœ…
C++ βœ…
Objective C βœ…
PHP βœ…
Ruby βœ…
Rust βœ…
Python and PYI stubs βœ…
Other languages and frameworks βœ… (via third-party protoc plugins)

Protoc support

Feature Support
From Maven repositories βœ… (any Google-released version)
From system path βœ… (as long as it is installed first)
From a URL βœ… (no SOCKS/HTTP proxy support at this time)

Protoc features

Feature Support
Proto2 βœ…
Proto3 βœ…
Editions βœ…
Failing on warnings βœ… (opt-in via plugin configuration)
Lite builds βœ… (opt-in via plugin configuration)
Generation of binary descriptors βœ… (opt-in via plugin configuration)
Controlling import inclusion in binary descriptors βœ… (opt-in via plugin configuration)
Controlling source info inclusion in binary descriptors βœ… (opt-in via plugin configuration)
Building from FileDescriptorSet descriptors βœ…

Maven integrations

Feature Support
Incremental compilation βœ…
Attaching protobuf sources to generated JARs βœ…
Attaching generated binary descriptors to builds βœ…
Detecting importable dependencies from project <dependencies/> βœ…
Detecting importable dependencies from provided filesystem paths βœ…
Respecting project <dependencyManagement/> βœ…
Compiling proto files from dependencies βœ… (opt-in)
Controlling binary descriptor type βœ…
Controlling binary descriptor classifier βœ…
Controlling binary descriptor attachment βœ…
Generation of main sources βœ…
Generation of test sources βœ…
Controlling the dependencies that are resolved by Maven scope βœ…
Marking generates sources as compilation candidates βœ…
Creating protobuf ZIP archives* πŸ’­
Creating protobuf TAR archives* πŸ’­
Generating JAR-based protoc plugins** πŸ’­
Consuming TAR archives for imports and sources πŸ’­

Tip

* This can currently be performed using maven-assembly-plugin.

** Set the Main-Class attribute in the MANIFEST.MF to do this. Use maven-shade-plugin if you need a fat JAR (not required for use with protobuf-maven-plugin, but may be useful for other use cases with third party tooling and build systems).

Protoc plugin integrations

Feature Support
Calling binary protoc plugins βœ… (from Maven repositories, URLs, system path)
Calling JVM-based protoc plugins βœ… (from Maven repositories, URLs, system path -- generates the shims automatically for you)
Calling plugins distributed in tarballs πŸ’­

Additional dependency management integrations

Feature Support
Importing paths without adding to the Maven project βœ… (via plugin configuration)
Generating code from additional paths without adding to the Maven project βœ… (via plugin configuration)
Controlling includes and excludes by path βœ… (via Glob expressions in plugin configuration)
Failing on invalid dependencies βœ… (opt-in via plugin configuration)
Failing on missing sources βœ… (opt-out via plugin configuration)
Controlling whether transitive dependencies are included βœ… (globally, or per dependency via plugin configuration)
0