diff --git a/spring-xd-runner/src/main/java/org/springframework/cloud/streams/xd/ModuleOptionsPropertySourceInitializer.java b/spring-xd-runner/src/main/java/org/springframework/cloud/streams/xd/ModuleOptionsPropertySourceInitializer.java index bf94164a6..519d670bf 100644 --- a/spring-xd-runner/src/main/java/org/springframework/cloud/streams/xd/ModuleOptionsPropertySourceInitializer.java +++ b/spring-xd-runner/src/main/java/org/springframework/cloud/streams/xd/ModuleOptionsPropertySourceInitializer.java @@ -16,6 +16,8 @@ package org.springframework.cloud.streams.xd; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -60,14 +62,15 @@ ApplicationContextInitializer { @Autowired private ModuleProperties module = new ModuleProperties(); - @Autowired(required=false) + @Autowired(required = false) private EnvironmentAwareModuleOptionsMetadataResolver wrapper; @Override public void initialize(ConfigurableApplicationContext applicationContext) { ConfigurableEnvironment environment = applicationContext.getEnvironment(); ModuleOptionsMetadataResolver resolver = moduleOptionsMetadataResolver(environment); - ModuleOptionsMetadata resolved = resolver.resolve(getModuleDefinition()); + ModuleOptionsMetadata resolved = resolver + .resolve(getModuleDefinition(applicationContext)); Map map = new LinkedHashMap(); for (ModuleOption option : resolved) { if (option.getDefaultValue() != null) { @@ -77,16 +80,27 @@ ApplicationContextInitializer { insert(environment, new MapPropertySource("moduleDefaults", map)); } - private ModuleDefinition getModuleDefinition() { + private ModuleDefinition getModuleDefinition( + ConfigurableApplicationContext applicationContext) { + String location = "file:."; + ClassLoader classLoader = applicationContext.getClassLoader(); + if (classLoader instanceof URLClassLoader) { + URL[] urls = ((URLClassLoader) classLoader).getURLs(); + String firstUrl = urls[0].toString(); + if (firstUrl.startsWith("jar:") && firstUrl.endsWith("!/")) { + location = firstUrl.substring(4, firstUrl.length() - 2); + } + } return ModuleDefinitions.simple(this.module.getName(), - ModuleType.valueOf(this.module.getType()), "file:."); + ModuleType.valueOf(this.module.getType()), location); } private void insert(ConfigurableEnvironment environment, MapPropertySource source) { environment.getPropertySources().addLast(source); } - private ModuleOptionsMetadataResolver moduleOptionsMetadataResolver(Environment environment) { + private ModuleOptionsMetadataResolver moduleOptionsMetadataResolver( + Environment environment) { List delegates = new ArrayList(); delegates.add(defaultResolver()); delegates.add(new ModuleTypeConversionPluginMetadataResolver()); @@ -94,7 +108,7 @@ ApplicationContextInitializer { DelegatingModuleOptionsMetadataResolver delegatingResolver = new DelegatingModuleOptionsMetadataResolver(); delegatingResolver.setDelegates(delegates); ModuleOptionsMetadataResolver resolver = delegatingResolver; - if (this.wrapper!=null) { + if (this.wrapper != null) { this.wrapper.setDelegate(delegatingResolver); resolver = this.wrapper; } @@ -119,7 +133,7 @@ ApplicationContextInitializer { @Configuration protected static class ModulePropertiesConfiguration { - @Bean(name="spring.cloud.channels.CONFIGURATION_PROPERTIES") + @Bean(name = "spring.cloud.channels.CONFIGURATION_PROPERTIES") public ModuleProperties moduleProperties() { return new ModuleProperties(); }