Skip to content

[Bug] Annotation processor generated duplicated classes from dependency that also used autovalue #1734

Open
@Abacn

Description

@Abacn

My Maven project is a java library, and it has another java library dependency, both my project and that dependency are under same package name.

Here is a minimum example.

My project has a single source file:

package org.apache.beam.sdk.io.gcp.spanner;

import com.google.auto.value.AutoValue;

@AutoValue
public abstract class DuplicateSpannerConfig {

  @AutoValue.Builder
  public abstract static class Builder {

    public abstract DuplicateSpannerConfig build();
  }
}

and declared a dependency

<properties>
    <autovalue.version>1.10.4</autovalue.version>
    <beam.version>2.54.0</beam.version>
    <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.google.auto.value</groupId>
      <artifactId>auto-value</artifactId>
      <version>${autovalue.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.google.auto.value</groupId>
      <artifactId>auto-value-annotations</artifactId>
      <version>${autovalue.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
      <version>${beam.version}</version>
    </dependency>
  </dependencies>

Run mvn clean compile

Expected: only AutoValue_DuplicateSpannerConfig in target/classes/org/apache/beam/sdk/io/gcp/spanner/ and target/classes

Actual: there are many AutoValue_* classes, seemingly regenerated from binaries in beam-sdks-java-io-google-cloud-platform in target/classes/org/apache/beam/sdk/io/gcp/spanner/.

Also, it seems there are specific conditions to trigger this bug:

  • If I my the @AutoValue class into an inner class, only my class was processed.

  • I also setup a same Gradle project, instead of using Maven, it works fine

The example is also available at https://github.com/Abacn/codesnippets/tree/master/AutoValueTest .

This was found by https://github.com/GoogleCloudPlatform/DataflowTemplates/actions/runs/8268070883 and reproduced locally. It is problematic for that project because the duplicated AutoValue_* classes does not handle nullable members correctly. For example, even though the decompiled dependency jar shows the @AutoValue abstract class has nullable members, e.g.

abstract @UnknownKeyFor @NonNull @Initialized Builder setCredentials(@UnknownKeyFor @NonNull @Initialized ValueProvider<@UnknownKeyFor @NonNull @Initialized Credentials> credentials);

and the AutoValue class in the dependency jar correctly marked it nullable

private @Nullable ValueProvider<Credentials> credentials;

nullable annotations get lost in the duplicate (generated) AutoValue class, unless my project duplicate the sources of the dependency jar (that is what currently did in DataflowTemplates/v1/.../gcp/spanner

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions