diff --git a/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt b/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt index 0f531a1..964a3da 100644 --- a/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt +++ b/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt @@ -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 = diff --git a/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt b/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt index 51e448e..13e0d34 100644 --- a/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt +++ b/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt @@ -24,8 +24,15 @@ class JavaagentJibPlugin : Plugin { 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 diff --git a/plugin/src/main/java/com/ryandens/javaagent/AgentOptionsResolver.java b/plugin/src/main/java/com/ryandens/javaagent/AgentOptionsResolver.java index 5f1149e..ba27b7f 100644 --- a/plugin/src/main/java/com/ryandens/javaagent/AgentOptionsResolver.java +++ b/plugin/src/main/java/com/ryandens/javaagent/AgentOptionsResolver.java @@ -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; @@ -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()}). * *

This class is written in Java for the same reason as {@link JavaForkOptionsConfigurer}: to * avoid the 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. * @@ -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> optionsByFileName( + public static Provider> optionsByFilePath( final Configuration configuration, final Provider> coordinateOptions) { return configuration .getIncoming() @@ -49,18 +51,22 @@ public static Provider> optionsByFileName( .map( artifacts -> { final Map coordinates = coordinateOptions.getOrElse(new HashMap<>()); - final Map byFileName = new HashMap<>(); + final Map 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; }); } diff --git a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java index 062b593..da42f84 100644 --- a/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java +++ b/plugin/src/main/java/com/ryandens/javaagent/JavaForkOptionsConfigurer.java @@ -29,13 +29,13 @@ 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> javaagentConfiguration, - Provider> optionsByFileName) { + Provider> optionsByFilePath) { final List list = new ArrayList<>(); //noinspection Convert2Lambda @@ -43,12 +43,12 @@ public static void configureJavaForkOptions( new CommandLineArgumentProvider() { @Override public Iterable asArguments() { - final Map options = optionsByFileName.get(); + final Map 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) { diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationDistributionPlugin.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationDistributionPlugin.kt index 8225644..8a06879 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationDistributionPlugin.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationDistributionPlugin.kt @@ -31,8 +31,8 @@ class JavaagentApplicationDistributionPlugin : javaagentConfiguration: NamedDomainObjectProvider, ) { 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) @@ -59,8 +59,8 @@ class JavaagentApplicationDistributionPlugin : it.inputs.property("agentOptions", extension.agentOptions) // custom start script generator that replaces the placeholder val agentFiles: Provider> = 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) } } } diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationRunPlugin.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationRunPlugin.kt index 757bab8..300d4de 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationRunPlugin.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentApplicationRunPlugin.kt @@ -20,8 +20,8 @@ class JavaagentApplicationRunPlugin : javaagentConfiguration: NamedDomainObjectProvider, ) { 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 @@ -41,7 +41,7 @@ class JavaagentApplicationRunPlugin : JavaForkOptionsConfigurer.configureJavaForkOptions( it, javaagentConfiguration.map { configuration -> configuration.files }, - optionsByFileName, + optionsByFilePath, ) } } diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt index ffe084e..3c7819e 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentAwareStartScriptGenerator.kt @@ -12,7 +12,7 @@ import java.io.Writer class JavaagentAwareStartScriptGenerator( private val javaagentConfiguration: Provider>, private val platform: Platform, - private val optionsByFileName: Provider>, + private val optionsByFilePath: Provider>, private val inner: ScriptGenerator = DefaultTemplateBasedStartScriptGenerator( platform.lineSeparator, @@ -32,7 +32,7 @@ class JavaagentAwareStartScriptGenerator( platform.pathSeparator, platform.appHomeVar, platform.agentArgSeparator, - optionsByFileName, + optionsByFilePath, ), ) } @@ -61,7 +61,7 @@ class JavaagentAwareStartScriptGenerator( private val pathSeparator: String, private val appHomeVar: String, private val agentArgSeparator: String, - private val optionsByFileName: Provider>, + private val optionsByFilePath: Provider>, ) : Writer() { override fun close() { inner.close() @@ -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" }, ) diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentTestPlugin.kt b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentTestPlugin.kt index 80fa3d7..c86b92d 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentTestPlugin.kt +++ b/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentTestPlugin.kt @@ -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 { @@ -59,7 +59,7 @@ class JavaagentTestPlugin : javaagentTestConfiguration.map { configuration -> configuration.files }, - optionsByFileName, + optionsByFilePath, ) } }