mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-07-05 00:56:58 +08:00
[bs-29] Support for XML configuration in groovy apps
Mixed .groovy and .xml now supported bia spring CLI, e.g. $ spring samples/runner.groovy samples/runner.xml [Fixes #48059037]
This commit is contained in:
parent
bb62ca835e
commit
e3d5bf2e21
10
spring-bootstrap-cli/samples/runner.groovy
Normal file
10
spring-bootstrap-cli/samples/runner.groovy
Normal file
|
@ -0,0 +1,10 @@
|
|||
package org.test
|
||||
|
||||
class Runner implements CommandLineRunner {
|
||||
|
||||
void run(String... args) {
|
||||
print "Hello World!"
|
||||
}
|
||||
}
|
||||
|
||||
|
9
spring-bootstrap-cli/samples/runner.xml
Normal file
9
spring-bootstrap-cli/samples/runner.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||
|
||||
<bean id="runner" class="org.test.Runner"/>
|
||||
|
||||
</beans>
|
||||
|
|
@ -22,6 +22,7 @@ import groovy.lang.GroovyClassLoader.ClassCollector;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.codehaus.groovy.ast.ClassNode;
|
||||
|
@ -81,6 +82,21 @@ public class GroovyCompiler {
|
|||
.addCompilationCustomizers(new CompilerAutoConfigureCustomizer());
|
||||
}
|
||||
|
||||
public Object[] sources(File[] files) throws CompilationFailedException, IOException {
|
||||
List<File> compilables = new ArrayList<File>();
|
||||
List<Object> others = new ArrayList<Object>();
|
||||
for (File file : files) {
|
||||
if (file.getName().endsWith(".groovy") || file.getName().endsWith(".java")) {
|
||||
compilables.add(file);
|
||||
} else {
|
||||
others.add(file);
|
||||
}
|
||||
}
|
||||
Class<?>[] compiled = compile(compilables.toArray(new File[compilables.size()]));
|
||||
others.addAll(0, Arrays.asList(compiled));
|
||||
return others.toArray(new Object[others.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile the specified Groovy source files, applying any
|
||||
* {@link CompilerAutoConfiguration}s. All classes defined in the files will be
|
||||
|
|
|
@ -75,13 +75,13 @@ public class BootstrapRunner {
|
|||
stop();
|
||||
|
||||
// Compile
|
||||
Class<?>[] classes = this.compiler.compile(this.files);
|
||||
if (classes.length == 0) {
|
||||
Object[] sources = this.compiler.sources(this.files);
|
||||
if (sources.length == 0) {
|
||||
throw new RuntimeException("No classes found in '" + this.files + "'");
|
||||
}
|
||||
|
||||
// Run in new thread to ensure that the context classloader is setup
|
||||
this.runThread = new RunThread(classes);
|
||||
this.runThread = new RunThread(sources);
|
||||
this.runThread.start();
|
||||
this.runThread.join();
|
||||
|
||||
|
@ -106,18 +106,18 @@ public class BootstrapRunner {
|
|||
*/
|
||||
private class RunThread extends Thread {
|
||||
|
||||
private final Class<?>[] classes;
|
||||
private final Object[] sources;
|
||||
|
||||
private Object applicationContext;
|
||||
|
||||
/**
|
||||
* Create a new {@link RunThread} instance.
|
||||
* @param classes the classes to launch
|
||||
* @param sources the sources to launch
|
||||
*/
|
||||
public RunThread(Class<?>... classes) {
|
||||
this.classes = classes;
|
||||
if (classes.length != 0) {
|
||||
setContextClassLoader(classes[0].getClassLoader());
|
||||
public RunThread(Object... sources) {
|
||||
this.sources = sources;
|
||||
if (sources.length != 0 && sources[0] instanceof Class) {
|
||||
setContextClassLoader(((Class<?>) sources[0]).getClassLoader());
|
||||
}
|
||||
setDaemon(true);
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ public class BootstrapRunner {
|
|||
"org.springframework.bootstrap.SpringApplication");
|
||||
Method method = application.getMethod("run", Object[].class,
|
||||
String[].class);
|
||||
this.applicationContext = method.invoke(null, this.classes,
|
||||
this.applicationContext = method.invoke(null, this.sources,
|
||||
BootstrapRunner.this.args);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
|
|
|
@ -134,4 +134,11 @@ public class SampleIntegrationTests {
|
|||
assertTrue("Wrong output: " + output, output.contains("Hello, World"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void xmlSample() throws Exception {
|
||||
start("samples/app.xml", "samples/runner.groovy");
|
||||
String output = getOutput();
|
||||
assertTrue("Wrong output: " + output, output.contains("Hello World"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user