我正在使用SQL Server Language扩展功能来将SQL Server调用到Spring Boot应用程序中。
如本tutorial中所述,我使用扩展了AbstractSqlServerExtensionExecutor
的类来调用存储过程:
EXEC sp_execute_external_script
@language = N'Java'
, @script = N'com.example.Sample'
, @input_data_1 = @query
, @params = N'@regexExpr nvarchar(200)'
, @regexExpr = @expr
with result sets ((ID int, text nvarchar(100)));
然后,SQL Server使用其自己的Java应用程序(称为Launchpad)实例化com.example.Sample
,然后调用Sample
的init方法及其后的execute方法。
但是,com.example.Sample
在启动JAR中。因此,Launchpad在类路径上找不到它。这是因为启动JAR在/BOOT-INF/classes
文件夹中有它。我不能告诉SQL Server使用org.springframework.boot.loader.JarLauncher
,因为@script
必须是AbstractSqlServerExtensionExecutor
。
要解决此问题,我使用shadow创建了一个非引导uber jar。这样,Sample.class位于/com/example/
的jar中,并且Launchpad可以找到它。然后,我可以在Sample
的构造函数中启动我的Spring应用程序:
public class Sample extends AbstractSqlServerExtensionExecutor {
public Sample() {
executorExtensionVersion = SQLSERVER_JAVA_LANG_EXTENSION_V1;
executorInputDatasetClassName = PrimitiveDataset.class.getName();
executorOutputDatasetClassName = PrimitiveDataset.class.getName();
Main.main(new String[] {});
}
...
}
@SpringBootApplication
public class Main {
public static void main(String[] args) {
new SpringApplicationBuilder(Main.class)
.web(WebApplicationType.NONE)
.run(args);
}
}
这将以Spring Boot应用程序启动我的应用程序,但找不到位于jar根目录的application.yml
文件。
如何从另一个应用程序(在本例中为SQL Server的Launchpad)正确运行Spring Boot应用程序的应用程序属性?特别是,我需要使用application.yml中定义的属性来启动Spring Boot应用程序。