Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class JavaagentJibExtension :
}

val localAgentPaths = extraConfig.get().javaagentFiles.get()
val agentOptions = extraConfig.get().agentOptions.get()
val agentOptions = extraConfig.get().agentOptions.getOrElse(emptyMap())

val planBuilder = buildPlan.toBuilder()
val newEntrypoint =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@ class JavaagentJibPlugin : Plugin<Project> {
val javaagentConfiguration = project.configurations.named(JavaagentBasePlugin.CONFIGURATION_NAME)

val javaagentExtension = project.extensions.getByType(JavaagentExtension::class.java)
val optionsByFilePath =
AgentOptionsResolver.optionsByFilePath(javaagentConfiguration.get(), javaagentExtension.agentOptions)
// Transform to file-name keyed map for the Jib extension, which looks up by the copied file's name
val optionsByFileName =
AgentOptionsResolver.optionsByFileName(javaagentConfiguration.get(), javaagentExtension.agentOptions)
optionsByFilePath.map { pathMap ->
pathMap.entries.associate { (path, options) ->
java.io.File(path).name to options
}
}

val destinationDirectory =
project.tasks
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.ryandens.javaagent;

import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.HashMap;
import java.util.Map;
import org.gradle.api.artifacts.Configuration;
Expand All @@ -12,9 +14,9 @@

/**
* Resolves the {@link JavaagentExtension#getAgentOptions() agent options} declared by coordinate
* into a map keyed by the resolved artifact file name, which is the join key every {@code
* -javaagent:} argument site can compute (the run/test sites hold the {@link File}, the
* distribution and jib sites use {@code file.getName()}).
* into a map keyed by the resolved artifact's full canonical file path, which is the join key every
* {@code -javaagent:} argument site can compute (the run/test sites hold the {@link File}, the
* distribution and jib sites use {@code file.getCanonicalPath()}).
*
* <p>This class is written in Java for the same reason as {@link JavaForkOptionsConfigurer}: to
* avoid the <a
Expand All @@ -27,7 +29,7 @@ public final class AgentOptionsResolver {
private AgentOptionsResolver() {}

/**
* Builds a {@code fileName -> options} map from the resolved artifacts of the provided
* Builds a {@code filePath -> options} map from the resolved artifacts of the provided
* configuration and the coordinate-keyed options declared on the {@link JavaagentExtension}. Only
* agents that have options declared appear in the resulting map.
*
Expand All @@ -38,9 +40,9 @@ private AgentOptionsResolver() {}
* @param configuration the resolvable javaagent configuration whose artifacts should be matched
* @param coordinateOptions options keyed by dependency coordinate (see {@link
* JavaagentExtension})
* @return provider of a map from resolved artifact file name to its option string
* @return provider of a map from resolved artifact file path to its option string
*/
public static Provider<Map<String, String>> optionsByFileName(
public static Provider<Map<String, String>> optionsByFilePath(
final Configuration configuration, final Provider<Map<String, String>> coordinateOptions) {
return configuration
.getIncoming()
Expand All @@ -49,18 +51,22 @@ public static Provider<Map<String, String>> optionsByFileName(
.map(
artifacts -> {
final Map<String, String> coordinates = coordinateOptions.getOrElse(new HashMap<>());
final Map<String, String> byFileName = new HashMap<>();
final Map<String, String> byFilePath = new HashMap<>();
if (coordinates.isEmpty()) {
return byFileName;
return byFilePath;
}
for (final ResolvedArtifactResult artifact : artifacts) {
final String key = coordinateKey(artifact.getId().getComponentIdentifier());
final String options = coordinates.get(key);
if (options != null) {
byFileName.put(artifact.getFile().getName(), options);
try {
byFilePath.put(artifact.getFile().getCanonicalPath(), options);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
return byFileName;
return byFilePath;
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,26 @@ private JavaForkOptionsConfigurer() {}
*
* @param javaForkOptions to be configured
* @param javaagentConfiguration files to be added as javaagents
* @param optionsByFileName options to append after {@code =}, keyed by agent file name (see
* @param optionsByFilePath options to append after {@code =}, keyed by agent file path (see
* {@link AgentOptionsResolver})
*/
public static void configureJavaForkOptions(
JavaForkOptions javaForkOptions,
Provider<Set<File>> javaagentConfiguration,
Provider<Map<String, String>> optionsByFileName) {
Provider<Map<String, String>> optionsByFilePath) {
final List<CommandLineArgumentProvider> list = new ArrayList<>();

//noinspection Convert2Lambda
list.add(
new CommandLineArgumentProvider() {
@Override
public Iterable<String> asArguments() {
final Map<String, String> options = optionsByFileName.get();
final Map<String, String> options = optionsByFilePath.get();
return javaagentConfiguration.get().stream()
.map(
file -> {
try {
final String options0 = options.get(file.getName());
final String options0 = options.get(file.getCanonicalPath());
final String suffix = options0 == null ? "" : "=" + options0;
return "-javaagent:" + file.getCanonicalPath() + suffix;
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ class JavaagentApplicationDistributionPlugin :
javaagentConfiguration: NamedDomainObjectProvider<Configuration>,
) {
val extension = project.extensions.getByType(JavaagentExtension::class.java)
val optionsByFileName =
AgentOptionsResolver.optionsByFileName(javaagentConfiguration.get(), extension.agentOptions)
val optionsByFilePath =
AgentOptionsResolver.optionsByFilePath(javaagentConfiguration.get(), extension.agentOptions)

project.extensions
.getByType(DistributionContainer::class.java)
Expand All @@ -59,8 +59,8 @@ class JavaagentApplicationDistributionPlugin :
it.inputs.property("agentOptions", extension.agentOptions)
// custom start script generator that replaces the placeholder
val agentFiles: Provider<Set<File>> = javaagentConfiguration.map { configuration -> configuration.files }
it.unixStartScriptGenerator = JavaagentAwareStartScriptGenerator(agentFiles, Platform.UNIX, optionsByFileName)
it.windowsStartScriptGenerator = JavaagentAwareStartScriptGenerator(agentFiles, Platform.WINDOWS, optionsByFileName)
it.unixStartScriptGenerator = JavaagentAwareStartScriptGenerator(agentFiles, Platform.UNIX, optionsByFilePath)
it.windowsStartScriptGenerator = JavaagentAwareStartScriptGenerator(agentFiles, Platform.WINDOWS, optionsByFilePath)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class JavaagentApplicationRunPlugin :
javaagentConfiguration: NamedDomainObjectProvider<Configuration>,
) {
val extension = project.extensions.getByType(JavaagentExtension::class.java)
val optionsByFileName =
AgentOptionsResolver.optionsByFileName(javaagentConfiguration.get(), extension.agentOptions)
val optionsByFilePath =
AgentOptionsResolver.optionsByFilePath(javaagentConfiguration.get(), extension.agentOptions)
// configure the run task to use the `javaagent` flag pointing to the dependency stored in the local Maven repository
project.tasks.named(ApplicationPlugin.TASK_RUN_NAME, JavaExec::class.java).configure {
// The agent jars are passed to the JVM via a CommandLineArgumentProvider (see
Expand All @@ -41,7 +41,7 @@ class JavaagentApplicationRunPlugin :
JavaForkOptionsConfigurer.configureJavaForkOptions(
it,
javaagentConfiguration.map { configuration -> configuration.files },
optionsByFileName,
optionsByFilePath,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import java.io.Writer
class JavaagentAwareStartScriptGenerator(
private val javaagentConfiguration: Provider<Set<File>>,
private val platform: Platform,
private val optionsByFileName: Provider<Map<String, String>>,
private val optionsByFilePath: Provider<Map<String, String>>,
private val inner: ScriptGenerator =
DefaultTemplateBasedStartScriptGenerator(
platform.lineSeparator,
Expand All @@ -32,7 +32,7 @@ class JavaagentAwareStartScriptGenerator(
platform.pathSeparator,
platform.appHomeVar,
platform.agentArgSeparator,
optionsByFileName,
optionsByFilePath,
),
)
}
Expand Down Expand Up @@ -61,7 +61,7 @@ class JavaagentAwareStartScriptGenerator(
private val pathSeparator: String,
private val appHomeVar: String,
private val agentArgSeparator: String,
private val optionsByFileName: Provider<Map<String, String>>,
private val optionsByFilePath: Provider<Map<String, String>>,
) : Writer() {
override fun close() {
inner.close()
Expand Down Expand Up @@ -106,13 +106,13 @@ class JavaagentAwareStartScriptGenerator(
.replace("-javaagent:COM_RYANDENS_JAVAAGENTS_PLACEHOLDER.jar ", "")
.replace("-javaagent:COM_RYANDENS_JAVAAGENTS_PLACEHOLDER.jar", "")
} else {
val options = optionsByFileName.get()
val options = optionsByFilePath.get()
str.replace(
"-javaagent:COM_RYANDENS_JAVAAGENTS_PLACEHOLDER.jar",
files.joinToString(
agentArgSeparator,
) { jar ->
val suffix = options[jar.name]?.let { "=$it" } ?: ""
val suffix = options[jar.canonicalPath]?.let { "=$it" } ?: ""
"-javaagent:$appHomeVar${pathSeparator}agent-libs$pathSeparator${jar.name}$suffix"
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ class JavaagentTestPlugin :
val enabled = calculateEnabled(project, extension)

val javaagentExtension = project.extensions.getByType(JavaagentExtension::class.java)
val optionsByFileName =
AgentOptionsResolver.optionsByFileName(javaagentTestConfiguration.get(), javaagentExtension.agentOptions)
val optionsByFilePath =
AgentOptionsResolver.optionsByFilePath(javaagentTestConfiguration.get(), javaagentExtension.agentOptions)

// configure the run task to use the `javaagent` flag pointing to the dependency stored in the local Maven repository
project.tasks.named(JavaPlugin.TEST_TASK_NAME, Test::class.java).configure {
Expand All @@ -59,7 +59,7 @@ class JavaagentTestPlugin :
javaagentTestConfiguration.map { configuration ->
configuration.files
},
optionsByFileName,
optionsByFilePath,
)
}
}
Expand Down
Loading