Create spring boot starter with spring factory

This commit is contained in:
Thibaud Lepretre
2019-06-26 10:06:58 +02:00
committed by Remko Popma
parent 2e825a3ca8
commit 8569785fdc
7 changed files with 103 additions and 1 deletions

View File

@@ -10,6 +10,7 @@ jlineVersion = 2.14.6
jline3Version = 3.9.0
junitDepVersion = 4.11
junitVersion = 4.12
springBootVersion = 2.1.6.RELEASE
# projectPreviousReleaseVersion is non-SNAPSHOT, only published releases
projectPreviousReleaseVersion = 4\\.0\\.0-beta-2
@@ -20,4 +21,4 @@ projectVersion = 4.0.0-rc-1-SNAPSHOT
releaseDate = 2019-06-20
releaseDatePreviousRegex = 2019\\-06\\-20
systemRulesVersion = 1.17.1
systemRulesVersion = 1.17.1

View File

@@ -0,0 +1,19 @@
plugins {
id 'java'
}
group 'info.picocli'
version '4.0.0-rc-1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile rootProject
compile (group: 'org.springframework.boot', name: 'spring-boot-starter', version: "$springBootVersion" )
compileOnly("org.springframework.boot:spring-boot-configuration-processor:$springBootVersion")
testCompile group: 'junit', name: 'junit', version: '4.12'
}

View File

@@ -0,0 +1,24 @@
package picocli.spring.boot.autoconfigure;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import picocli.CommandLine;
/**
* @author Thibaud Leprêtre
*/
@Configuration
@ConditionalOnClass(CommandLine.class)
public class PicocliAutoConfiguration {
@Bean
@ConditionalOnMissingBean(CommandLine.IFactory.class)
CommandLine.IFactory springPicocliFactory(ApplicationContext applicationContext) {
return new SpringPicocliFactory(applicationContext);
}
}

View File

@@ -0,0 +1,37 @@
package picocli.spring.boot.autoconfigure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import picocli.CommandLine;
/**
* @author Thibaud Leprêtre
*/
public class SpringPicocliFactory implements CommandLine.IFactory {
private static final Logger logger = LoggerFactory.getLogger(SpringPicocliFactory.class);
private final ApplicationContext applicationContext;
public SpringPicocliFactory(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public <K> K create(Class<K> clazz) throws Exception {
try {
return getBeanOrCreate(clazz);
} catch (Exception e) {
logger.warn("unable to get bean of class {}, use default Picocli factory creation", clazz);
return CommandLine.defaultFactory().create(clazz);
}
}
private <K> K getBeanOrCreate(Class<K> clazz) {
try {
return applicationContext.getBean(clazz);
} catch (Exception e) {
return applicationContext.getAutowireCapableBeanFactory().createBean(clazz);
}
}
}

View File

@@ -0,0 +1,17 @@
plugins {
id 'java'
}
group 'info.picocli'
version '4.0.0-rc-1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile (group: 'org.springframework.boot', name: 'spring-boot-starter', version: '2.1.6.RELEASE' )
compileOnly("org.springframework.boot:spring-boot-configuration-processor:2.1.6.RELEASE")
}

View File

@@ -0,0 +1 @@
provides: picocli

View File

@@ -10,3 +10,6 @@ if (org.gradle.api.JavaVersion.current().isJava8Compatible()) {
} else {
println("Excluding module picocli-annotation-processing-tests from the build: they require Java 8 but we have Java version ${org.gradle.api.JavaVersion.current()}")
}
include 'picocli-spring-boot-starter'
include 'picocli-spring-boot-autoconfigure'