【问题标题】:How to push external xml file into spring boot embedded tomcat continer如何将外部xml文件推送到spring boot嵌入式tomcat容器中
【发布时间】:2018-05-28 19:51:20
【问题描述】:

我创建了提供 fat-jar 的 springboot 项目。我想在运行时将外部 xml 文件推送到它。我想将该 xml 文件放入 spring-boot-tomcat 容器中。尝试了很多方法来做到这一点(@import、--spring.config.location 等)这些方法对我来说并不奏效。

该 xml 文件是 ApplicationInsight.xml,用于将遥测数据从我们的应用程序发布到 Azure 门户。

非常感谢任何帮助。

【问题讨论】:

标签: spring-boot azure-application-insights embedded-tomcat-7


【解决方案1】:

基于 GitHJub 问题,我认为部分问题在于您如何传递 JVM 参数,以及您如何使用“spring.config.location”。

我真的不熟悉 Azure Insights,但如果我理解正确,它会尝试加载 ApplicationInsights.xml 文件来配置自身,并且它会自动执行此操作。所以你真的不能像我之前建议的那样在 WebConfigurerAdapter 中设置它,因为它在此之前已经初始化了自己,对吗?无论如何我都留下了那部分,但我知道它需要尽快加载,所以我提供了一些额外的方法来尽快将文件添加到类路径中。

新东西

首先看看你最初在 GitHub 上发布的这一行:

java -jar build/libs/file-gateway.jar --spring.config.location=classpath:/apps/conf/ApplicationInsight.xml 

相反,该值应该只是一个文件夹路径,没有“文件”前缀的“类路径”。另外,请尝试使用“-D”而不是“--”。

java -jar build/libs/file-gateway.jar -Dspring.config.location=/apps/conf/

该属性应该引用包含 Spring Boot 的自动配置属性文件的目录。它也可以用于引用特定的“application.properties|yml”文件。

这样,我之前的建议可能对你有用。

旧建议

如果您需要一种独特的方式来加载资源,您可以将资源处理程序添加到您的应用程序中。

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Value("${telemetry.folder}")
    private String telemetryFolder;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceLocations(telemetryFolder); 
    }
}

并且/或者您可以使用 apache IO 加载它:

@Value("${telemetry.file}")
private String telemetryFile;

@Autowired
private ResourceLoader resourceLoader;

public String telemtryXml(){

    return org.apache.commons.io.IOUtils.toString(resourceLoader.getResource(telemtryFile).getInputStream());
}

但这只有在您使用的 api 不需要更早初始化时才有效。

更多新内容

在您上一篇关于 GitHub 问题的帖子中,您尝试了以下方法:

java -jar build/libs/file-gateway.jar -applicationinsights.configurationDirectory="/apps/conf/"

相反,尝试将属性添加为 jvm 参数,如下所示:

java -jar build/libs/file-gateway.jar -Dapplicationinsights.configurationDirectory=/apps/conf/

请注意,我在 之后添加了一个大写的“D”字符,并从路径中删除了引号。

将文件添加到类路径的其他方法是。

  1. 将目录添加到 JVM 类路径。

    java -cp "build/libs/file-gateway.jar:/apps/conf/*" your.package.MainSpringBootApplication

这要求您指定(通常)用“@SpringBootApplication”注释并包含主方法的主类。您没有像以前那样执行 jar,但仍将其添加到类路径中。

  1. 忘掉 SpringBoot,回到你作为 JEE 开发人员的本源。在“src/main/resources/META-INF”文件夹或“src/main/webapp/META-INF”下为您的应用添加“context.xml”。如果我要构建可执行的 war 文件,我更喜欢后者,而前者用于 jar。

示例 context.xml:

<?xml version='1.0' encoding='utf-8'?>
<!-- path should be the context-path of you application.
<Context path="/">
  <Resources className="org.apache.catalina.webresources.StandardRoot">
    <PreResources base="/apps/conf"
                  className="org.apache.catalina.webresources.DirResourceSet"
                  internalPath="/"
                  webAppMount="/WEB-INF/classes"/>
  </Resources>
</Context>

您还可以将 JVM 参数与 EL 一起使用。

所以如果你用这个来执行jar:

java -jar build/libs/file-gateway.jar -Dapplicationinsights.configurationDirectory=/apps/conf/

你可以这样设置资源库:

<!--snip -->
<PreResources base="${applicationinsights.configurationDirectory}" 
<!--snip -->

希望对您有所帮助:)

【讨论】:

  • 我已经尝试了上述解决方案,但它没有成功,因为 spring 资源直接读取该 xml 文件而不是嵌入到嵌入式 tomcat 容器中
  • 啊……我明白了。让我更新我的答案以使其更有用。
  • 感谢您的详细描述。我已经尝试了上述所有旧建议、新东西和更多新东西。对我来说没有任何效果,还尝试在类路径中使用 context.xml 来读取 conf Dir。那些也没有帮助我 bcz spring 资源读取这些文件而不是 tomcat 容器。您能否让我知道在外部启动期间将 xml 文件直接推送到嵌入式 tomcat 的任何方法?或者以这样的方式设置一个 gradle 文件,嵌入式 tomcat 将在其 lib location 下获取外部 conf 文件。我需要在 Embedded-tomcat lib 文件夹中放置一个文件
  • 你能在 GitHub 上提供一个重现问题的示例项目吗?请务必包含有关您如何部署、运行和测试应用程序的详细信息。仅供参考:如果文件在 JVM 类路径中,那么它将可用于嵌入式 Tomcat,随后可用于 Spring Boot。另一种方法是在 application.properties 中定义一个 basedir(类似于 catalina.base),它允许外部 lib 文件夹。您还可以添加 Spring Boot 工厂。当然,您也可以编写一个 bash 或 cmd 脚本来在启动时将文件放在 jar 中。
  • 重现问题很简单,小型 spring boot 项目从 src/main/resource 读取 a.xml 文件。最后它会生成一个胖罐子。现在,当我使用嵌入式 tomcat 运行 jar 时,我想将一个 xml 文件放入它的容器中。我还尝试使用 shell 脚本修改 jar,所有这些都以损坏的 jar 异常告终。如果你找到了请告诉我
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 2018-01-08
  • 2017-12-01
  • 2017-01-30
  • 2015-09-10
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多