From e1bb5259a95be7e1362d24ea4cb7183412a35242 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 18 May 2018 11:45:24 +0100 Subject: [PATCH] Support for Start-Class as main --- .../function/deployer/ApplicationRunner.java | 4 +- .../FunctionCreatorConfiguration.java | 87 +++++++++++++------ .../SpringFunctionAppConfigurationTests.java | 9 +- .../resources/META-INF/thin-rabbit.properties | 1 + 4 files changed, 67 insertions(+), 34 deletions(-) diff --git a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java index 96bb6c23d..b3e1acd47 100644 --- a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java +++ b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java @@ -79,8 +79,8 @@ public class ApplicationRunner { private Map defaultProperties(String id) { Map map = new HashMap<>(); - map.put(LiveBeansView.MBEAN_DOMAIN_PROPERTY_NAME, "function-invoker-" + id); - map.put("spring.jmx.default-domain", "function-invoker-" + id); + map.put(LiveBeansView.MBEAN_DOMAIN_PROPERTY_NAME, "function-deployer-" + id); + map.put("spring.jmx.default-domain", "function-deployer-" + id); map.put("spring.jmx.enabled", "false"); return map; } diff --git a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java index 97f5f3edf..2f13c7bef 100644 --- a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java +++ b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java @@ -108,7 +108,7 @@ class FunctionCreatorConfiguration { try { logger.info( "Locating function from " + Arrays.asList(properties.getLocation())); - this.creator = new BeanCreator(expand(urls)); + this.creator = new BeanCreator(urls); this.creator.run(properties.getMain()); Arrays.stream(properties.getBean()).map(this.creator::create).sequential() .forEach(this.creator::register); @@ -125,30 +125,6 @@ class FunctionCreatorConfiguration { } } - private URL[] expand(URL[] urls) { - List result = new ArrayList<>(); - for (URL url : urls) { - result.addAll(expand(url)); - } - return result.toArray(new URL[0]); - } - - private List expand(URL url) { - if (!"file".equals(url.getProtocol())) { - return Collections.singletonList(url); - } - if (!url.toString().endsWith(".jar")) { - return Collections.singletonList(url); - } - try { - JarFileArchive archive = new JarFileArchive(new File(url.toURI())); - return Arrays.asList(new ComputeLauncher(archive).getClassLoaderUrls()); - } - catch (Exception e) { - throw new IllegalStateException("Cannot create class loader for " + url, e); - } - } - @PreDestroy public void close() { if (this.creator != null) { @@ -188,6 +164,15 @@ class FunctionCreatorConfiguration { super(archive); } + @Override + public String getMainClass() throws Exception { + try { + return super.getMainClass(); + } catch (Exception e) { + return null; + } + } + public URL[] getClassLoaderUrls() throws Exception { List archives = getClassPathArchives(); if (archives.isEmpty()) { @@ -254,12 +239,62 @@ class FunctionCreatorConfiguration { private ApplicationRunner runner; + private String defaultMain; + public BeanCreator(URL[] urls) { - functionClassLoader = new BeanCreatorClassLoader(urls, + functionClassLoader = new BeanCreatorClassLoader(expand(urls), getClass().getClassLoader().getParent()); + this.defaultMain = findMain(urls); + } + + private String findMain(URL[] urls) { + for (URL url : urls) { + try { + File file = new File(url.toURI()); + if (file.exists()) { + JarFileArchive archive = new JarFileArchive(file); + String main = new ComputeLauncher(archive).getMainClass(); + if (main !=null) { + return main; + } + } + } + catch (Exception e) { + // ignore + } + } + return null; + } + + private URL[] expand(URL[] urls) { + List result = new ArrayList<>(); + for (URL url : urls) { + result.addAll(expand(url)); + } + return result.toArray(new URL[0]); + } + + private List expand(URL url) { + if (!"file".equals(url.getProtocol())) { + return Collections.singletonList(url); + } + if (!url.toString().endsWith(".jar")) { + return Collections.singletonList(url); + } + try { + JarFileArchive archive = new JarFileArchive(new File(url.toURI())); + return Arrays.asList(new ComputeLauncher(archive).getClassLoaderUrls()); + } + catch (Exception e) { + throw new IllegalStateException("Cannot create class loader for " + url, + e); + } } public void run(String main) { + if (main == null) { + main = this.defaultMain; + } if (main == null) { return; } diff --git a/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java b/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java index 0716ee552..1b34fd23a 100644 --- a/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java +++ b/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java @@ -60,8 +60,7 @@ public abstract class SpringFunctionAppConfigurationTests { } @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myEmitter,myCounter", - "function.main=com.example.functions.FunctionApp" }) + @TestPropertySource(properties = { "function.bean=myEmitter,myCounter" }) public static class CompositeTests extends SpringFunctionAppConfigurationTests { @Test @@ -74,8 +73,7 @@ public abstract class SpringFunctionAppConfigurationTests { } @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myCounter", - "function.main=com.example.functions.FunctionApp" }) + @TestPropertySource(properties = { "function.bean=myCounter" }) public static class ProcessorTests extends SpringFunctionAppConfigurationTests { @Test @@ -88,8 +86,7 @@ public abstract class SpringFunctionAppConfigurationTests { } @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myDoubler", - "function.main=com.example.functions.FunctionApp" }) + @TestPropertySource(properties = { "function.bean=myDoubler" }) public static class SinkTests extends SpringFunctionAppConfigurationTests { @Rule diff --git a/spring-cloud-function-samples/function-sample/src/main/resources/META-INF/thin-rabbit.properties b/spring-cloud-function-samples/function-sample/src/main/resources/META-INF/thin-rabbit.properties index 3cfb4be15..cad8b872f 100644 --- a/spring-cloud-function-samples/function-sample/src/main/resources/META-INF/thin-rabbit.properties +++ b/spring-cloud-function-samples/function-sample/src/main/resources/META-INF/thin-rabbit.properties @@ -2,3 +2,4 @@ boms.spring-cloud-dependencies: org.springframework.cloud:spring-cloud-dependenc dependencies.spring-cloud-function-stream: org.springframework.cloud:spring-cloud-function-stream dependencies.spring-cloud-stream-rabbit: org.springframework.cloud:spring-cloud-starter-stream-rabbit exclusions.spring-cloud-function-web: org.springframework.cloud:spring-cloud-starter-function-web +exclusions.http-client: com.rabbitmq:http-client