Skip to content

Commit

Permalink
Merge pull request #34033 from gsmet/3.1.2-backports-1
Browse files Browse the repository at this point in the history
3.1.2 backports 1
  • Loading branch information
gsmet committed Jun 14, 2023
2 parents d68dd00 + b5b582a commit 0c16302
Show file tree
Hide file tree
Showing 75 changed files with 1,163 additions and 629 deletions.
30 changes: 23 additions & 7 deletions bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,17 @@
<microprofile-openapi.version>3.1</microprofile-openapi.version>
<smallrye-common.version>2.1.0</smallrye-common.version>
<smallrye-config.version>3.2.1</smallrye-config.version>
<smallrye-health.version>4.0.1</smallrye-health.version>
<smallrye-health.version>4.0.2</smallrye-health.version>
<smallrye-metrics.version>4.0.0</smallrye-metrics.version>
<smallrye-open-api.version>3.3.4</smallrye-open-api.version>
<smallrye-graphql.version>2.2.0</smallrye-graphql.version>
<smallrye-graphql.version>2.2.1</smallrye-graphql.version>
<smallrye-opentracing.version>3.0.3</smallrye-opentracing.version>
<smallrye-fault-tolerance.version>6.2.3</smallrye-fault-tolerance.version>
<smallrye-jwt.version>4.2.1</smallrye-jwt.version>
<smallrye-context-propagation.version>2.1.0</smallrye-context-propagation.version>
<smallrye-reactive-streams-operators.version>1.0.13</smallrye-reactive-streams-operators.version>
<smallrye-reactive-types-converter.version>3.0.0</smallrye-reactive-types-converter.version>
<smallrye-mutiny-vertx-binding.version>3.4.1</smallrye-mutiny-vertx-binding.version>
<smallrye-mutiny-vertx-binding.version>3.4.2</smallrye-mutiny-vertx-binding.version>
<smallrye-reactive-messaging.version>4.5.0</smallrye-reactive-messaging.version>
<smallrye-stork.version>2.2.0</smallrye-stork.version>
<jakarta.activation.version>2.1.2</jakarta.activation.version>
Expand Down Expand Up @@ -119,15 +119,15 @@
<wildfly-client-config.version>1.0.1.Final</wildfly-client-config.version>
<wildfly-elytron.version>2.1.0.Final</wildfly-elytron.version>
<jboss-threads.version>3.5.0.Final</jboss-threads.version>
<vertx.version>4.4.2</vertx.version>
<vertx.version>4.4.3</vertx.version>
<httpclient.version>4.5.14</httpclient.version>
<httpcore.version>4.4.16</httpcore.version>
<httpasync.version>4.1.5</httpasync.version>
<cronutils.version>9.2.1</cronutils.version>
<quartz.version>2.3.2</quartz.version>
<h2.version>2.1.214</h2.version> <!-- When updating, needs to be matched in io.quarkus.hibernate.orm.runtime.config.DialectVersions -->
<postgresql-jdbc.version>42.6.0</postgresql-jdbc.version>
<mariadb-jdbc.version>3.1.3</mariadb-jdbc.version>
<mariadb-jdbc.version>3.1.4</mariadb-jdbc.version>
<mysql-jdbc.version>8.0.30</mysql-jdbc.version>
<mssql-jdbc.version>12.2.0.jre11</mssql-jdbc.version>
<adal4j.version>1.6.7</adal4j.version>
Expand All @@ -141,10 +141,10 @@
<infinispan.version>14.0.9.Final</infinispan.version>
<infinispan.protostream.version>4.6.2.Final</infinispan.protostream.version>
<caffeine.version>3.1.5</caffeine.version>
<netty.version>4.1.92.Final</netty.version>
<netty.version>4.1.93.Final</netty.version>
<brotli4j.version>1.11.0</brotli4j.version>
<reactive-streams.version>1.0.4</reactive-streams.version>
<jboss-logging.version>3.5.0.Final</jboss-logging.version>
<jboss-logging.version>3.5.1.Final</jboss-logging.version>
<mutiny.version>2.1.0</mutiny.version>
<kafka3.version>3.4.0</kafka3.version>
<lz4.version>1.8.0</lz4.version> <!-- dependency of the kafka-clients that could be overridden by other imported BOMs in the platform -->
Expand Down Expand Up @@ -332,6 +332,12 @@
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<!-- Override the dependency on the vertx-jdbc-client, because of https://github.com/vert-x3/vertx-jdbc-client/pull/306 -->
<groupId>io.vertx</groupId>
<artifactId>vertx-jdbc-client</artifactId>
<version>${vertx.version}.1</version>
</dependency>

<!-- gRPC dependencies, imported as a BOM -->
<dependency>
Expand Down Expand Up @@ -4749,6 +4755,11 @@
<artifactId>jna</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-annotations</artifactId>
Expand Down Expand Up @@ -4853,6 +4864,11 @@
<artifactId>jaxb-core</artifactId>
<version>${jaxb-runtime.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>txw2</artifactId>
<version>${jaxb-runtime.version}</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion build-parent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
<supported-maven-versions>[3.8.2,)</supported-maven-versions>

<!-- These 2 properties are used by CreateProjectMojo to add the Maven Wrapper -->
<proposed-maven-version>3.9.1</proposed-maven-version>
<proposed-maven-version>3.9.2</proposed-maven-version>
<maven-wrapper.version>3.2.0</maven-wrapper.version>
<gradle-wrapper.version>8.1.1</gradle-wrapper.version>
<quarkus-gradle-plugin.version>${project.version}</quarkus-gradle-plugin.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ protected String configKey() {

@Override
protected void configure(TestSupport testSupport) {
testSupport.setPatterns(pattern, testSupport.exclude.pattern());
testSupport.setPatterns(pattern, testSupport.exclude != null ? testSupport.exclude.pattern() : null);
}
}

Expand All @@ -320,7 +320,7 @@ protected String configKey() {

@Override
protected void configure(TestSupport testSupport) {
testSupport.setPatterns(testSupport.include.pattern(), pattern);
testSupport.setPatterns(testSupport.include != null ? testSupport.include.pattern() : null, pattern);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
import io.quarkus.maven.dependency.ResolvedDependency;
import io.quarkus.paths.PathVisit;
import io.quarkus.paths.PathVisitor;
import io.quarkus.utilities.JavaBinFinder;

/**
* This build step builds both the thin jars and uber jars.
Expand Down Expand Up @@ -1681,7 +1682,7 @@ public boolean decompile(Path jarToDecompile) {
int dotIndex = jarToDecompile.getFileName().toString().indexOf('.');
String fileName = jarToDecompile.getFileName().toString().substring(0, dotIndex);
ProcessBuilder processBuilder = new ProcessBuilder(
Arrays.asList("java", "-jar", decompilerJar.toAbsolutePath().toString(),
Arrays.asList(JavaBinFinder.findBin(), "-jar", decompilerJar.toAbsolutePath().toString(),
jarToDecompile.toAbsolutePath().toString(),
context.decompiledOutputDir.resolve(fileName).toAbsolutePath().toString()));
if (log.isDebugEnabled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ private void assembleFastJar() {
getLogger().info("Synchronizing Quarkus build for {} packaging from {} and {} into {}", packageType(),
appBuildDir, depBuildDir, appTargetDir);
getFileSystemOperations().sync(sync -> {
sync.eachFile(new CopyActionDeleteNonWriteableTarget(appTargetDir.toPath()));
sync.into(appTargetDir);
sync.from(appBuildDir, depBuildDir);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -33,6 +34,8 @@
public abstract class QuarkusBuildDependencies extends QuarkusBuildTask {
static final String CLASS_LOADING_REMOVED_ARTIFACTS = "quarkus.class-loading.removed-artifacts";
static final String CLASS_LOADING_PARENT_FIRST_ARTIFACTS = "quarkus.class-loading.parent-first-artifacts";
static final String FILTER_OPTIONAL_DEPENDENCIES = "quarkus.package.filter-optional-dependencies";
static final String INCLUDED_OPTIONAL_DEPENDENCIES = "quarkus.package.included-optional-dependencies";

@Inject
public QuarkusBuildDependencies() {
Expand Down Expand Up @@ -138,33 +141,36 @@ private void jarDependencies(Path libBoot, Path libMain) {
Map<String, String> configMap = extension().buildEffectiveConfiguration(appModel.getAppArtifact()).configMap();

// see https://quarkus.io/guides/class-loading-reference#configuring-class-loading
String removedArtifactsProp = configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "");
java.util.Optional<Set<ArtifactKey>> optionalDependencies = java.util.Optional.ofNullable(
Set<ArtifactKey> removedArtifacts = java.util.Optional.ofNullable(
configMap.getOrDefault(CLASS_LOADING_REMOVED_ARTIFACTS, null))
.map(s -> Arrays.stream(s.split(","))
.map(String::trim)
.filter(gact -> !gact.isEmpty())
.map(ArtifactKey::fromString)
.collect(Collectors.toSet()));
Set<ArtifactKey> removedArtifacts = Arrays.stream(removedArtifactsProp.split(","))
.map(String::trim)
.filter(gact -> !gact.isEmpty())
.map(ArtifactKey::fromString)
.collect(Collectors.toSet());
.map(QuarkusBuildDependencies::dependenciesListToArtifactKeySet)
.orElse(Collections.emptySet());
getLogger().info("Removed artifacts: {}", configMap.getOrDefault(CLASS_LOADING_REMOVED_ARTIFACTS, "(none)"));

String parentFirstArtifactsProp = configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "");
Set<ArtifactKey> parentFirstArtifacts = dependenciesListToArtifactKeySet(parentFirstArtifactsProp);
getLogger().info("parent first artifacts: {}", configMap.getOrDefault(CLASS_LOADING_PARENT_FIRST_ARTIFACTS, "(none)"));

String optionalDependenciesProp = configMap.getOrDefault(INCLUDED_OPTIONAL_DEPENDENCIES, "");
boolean filterOptionalDependencies = Boolean
.parseBoolean(configMap.getOrDefault(FILTER_OPTIONAL_DEPENDENCIES, "false"));
Set<ArtifactKey> optionalDependencies = filterOptionalDependencies
? dependenciesListToArtifactKeySet(optionalDependenciesProp)
: Collections.emptySet();

appModel.getRuntimeDependencies().stream()
.filter(appDep -> {
// copied from io.quarkus.deployment.pkg.steps.JarResultBuildStep.includeAppDep
if (!appDep.isJar()) {
return false;
}
if (appDep.isOptional()) {
return optionalDependencies.map(appArtifactKeys -> appArtifactKeys.contains(appDep.getKey()))
.orElse(true);
if (filterOptionalDependencies && appDep.isOptional()) {
return optionalDependencies.contains(appDep.getKey());
}
return !removedArtifacts.contains(appDep.getKey());
})
.map(dep -> Map.entry(dep.isFlagSet(DependencyFlags.CLASSLOADER_RUNNER_PARENT_FIRST) ? libBoot : libMain, dep))
.map(dep -> Map.entry(dep.isFlagSet(DependencyFlags.CLASSLOADER_RUNNER_PARENT_FIRST)
|| parentFirstArtifacts.contains(dep.getKey()) ? libBoot : libMain, dep))
.peek(depAndTarget -> {
ResolvedDependency dep = depAndTarget.getValue();
Path targetDir = depAndTarget.getKey();
Expand All @@ -186,4 +192,12 @@ private void jarDependencies(Path libBoot, Path libMain) {
.collect(Collectors.toMap(Map.Entry::getKey, depAndTarget -> 1, Integer::sum))
.forEach((path, count) -> getLogger().info("Copied {} files into {}", count, path));
}

private static Set<ArtifactKey> dependenciesListToArtifactKeySet(String optionalDependenciesProp) {
return Arrays.stream(optionalDependenciesProp.split(","))
.map(String::trim)
.filter(gact -> !gact.isEmpty())
.map(ArtifactKey::fromString)
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package io.quarkus.gradle.tasks;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.stream.Collectors;

import javax.inject.Inject;

import org.gradle.api.Action;
import org.gradle.api.GradleException;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.FileCopyDetails;
import org.gradle.api.file.FileSystemOperations;
import org.gradle.api.logging.LogLevel;
import org.gradle.api.tasks.Classpath;
Expand Down Expand Up @@ -168,6 +172,9 @@ void generateBuild() {
PackageConfig.BuiltInType packageType = packageType();
getLogger().info("Building Quarkus app for package type {} in {}", packageType, genDir);

// Need to delete app-cds.jsa specially, because it's usually read-only and Gradle's delete file-system
// operation doesn't delete "read only" files :(
deleteFileIfExists(genDir.resolve(outputDirectory()).resolve("app-cds.jsa"));
getFileSystemOperations().delete(delete -> {
// Caching and "up-to-date" checks depend on the inputs, this 'delete()' should ensure that the up-to-date
// checks work against "clean" outputs, considering that the outputs depend on the package-type.
Expand Down Expand Up @@ -223,6 +230,7 @@ void generateBuild() {
getFileSystemOperations().copy(copy -> {
copy.from(buildDir);
copy.into(genDir);
copy.eachFile(new CopyActionDeleteNonWriteableTarget(genDir));
switch (packageType) {
case NATIVE:
copy.include(nativeRunnerFileName());
Expand Down Expand Up @@ -261,4 +269,32 @@ void abort(String message, Object... args) {
});
throw new StopExecutionException();
}

public static final class CopyActionDeleteNonWriteableTarget implements Action<FileCopyDetails> {
private final Path destDir;

public CopyActionDeleteNonWriteableTarget(Path destDir) {
this.destDir = destDir;
}

@Override
public void execute(FileCopyDetails details) {
// Delete a pre-existing non-writeable file, otherwise a copy or sync operation would fail.
// This situation happens for 'app-cds.jsa' files, which are created as "read only" files,
// prefer to keep those files read-only.

Path destFile = destDir.resolve(details.getPath());
if (Files.exists(destFile) && !Files.isWritable(destFile)) {
deleteFileIfExists(destFile);
}
}
}

protected static void deleteFileIfExists(Path file) {
try {
Files.deleteIfExists(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.CacheableTask;
import org.gradle.api.tasks.CompileClasspath;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.PathSensitive;
Expand Down Expand Up @@ -62,6 +63,11 @@ public void setCompileClasspath(Configuration compileClasspath) {
this.compileClasspath = compileClasspath;
}

@Input
public Map<String, String> getCachingRelevantInput() {
return extension().baseConfig().quarkusProperties();
}

@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
public Set<File> getInputDirectory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
import io.quarkus.utilities.OS;

public abstract class QuarkusTask extends DefaultTask {
private static final List<String> WORKER_BUILD_FORK_OPTIONS = List.of("quarkus.package.",
"quarkus.application.", "quarkus.gradle-worker.");

private final transient QuarkusPluginExtension extension;
protected final File projectDir;
protected final File buildDir;
Expand Down Expand Up @@ -85,15 +88,17 @@ private void configureProcessWorkerSpec(ProcessWorkerSpec processWorkerSpec, Map
forkOptions.environment("PATH", javaBin + File.pathSeparator + System.getenv("PATH"));
}

// It's kind of a "very big hammer" here, but this way we ensure that all 'quarkus.*' properties from
// all configuration sources are (forcefully) used in the Quarkus build - even properties defined on the
// QuarkusPluginExtension.
// It's kind of a "very big hammer" here, but this way we ensure that all necessary properties
// ("quarkus.package.*","quarkus.application,*", "quarkus.gradle-worker.*") from all configuration sources
// are (forcefully) used in the Quarkus build - even properties defined on the QuarkusPluginExtension.
// This prevents that settings from e.g. a application.properties takes precedence over an explicit
// setting in Gradle project properties, the Quarkus extension or even via the environment or system
// properties.
// see https://github.com/quarkusio/quarkus/issues/33321 why not all properties are passed as system properties
// Note that we MUST NOT mess with the system properties of the JVM running the build! And that is the
// main reason why build and code generation happen in a separate process.
configMap.entrySet().stream().filter(e -> e.getKey().startsWith("quarkus."))
configMap.entrySet().stream()
.filter(e -> WORKER_BUILD_FORK_OPTIONS.stream().anyMatch(e.getKey().toLowerCase()::startsWith))
.forEach(e -> forkOptions.systemProperty(e.getKey(), e.getValue()));

// populate worker classpath with additional content?
Expand Down
Loading

0 comments on commit 0c16302

Please sign in to comment.