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
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:
and declared a dependency
Run
mvn clean compileExpected: only AutoValue_DuplicateSpannerConfig in
target/classes/org/apache/beam/sdk/io/gcp/spanner/andtarget/classesActual: there are many AutoValue_* classes, seemingly regenerated from binaries in
beam-sdks-java-io-google-cloud-platformintarget/classes/org/apache/beam/sdk/io/gcp/spanner/.Also, it seems there are specific conditions to trigger this bug:
If I my the
@AutoValueclass 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
@AutoValueabstract class has nullable members, e.g.and the AutoValue class in the dependency jar correctly marked it nullable
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