从 jar 中的文件发出解组对象

Issue unmarshalling object from file inside jar

我正在尝试将 Microsoft Application Insights 与我的 spring 启动应用程序一起使用。

它使用 JAXB 从 ApplicationInsights.xml(存储在 /java/main/resources 中)加载 xml 配置,使用以下代码:https://github.com/Microsoft/ApplicationInsights-Java/blob/master/core/src/main/java/com/microsoft/applicationinsights/internal/config/JaxbAppInsightsConfigurationBuilder.java

这在通过 gradle 运行 启动 spring 启动应用程序时工作正常(因为资源存在于普通文件系统中)。

但是,如果我为此项目创建一个 jar 文件并尝试 运行 它,那么我会看到以下错误:

javax.xml.bind.UnmarshalException
 - with linked exception:
[java.io.FileNotFoundException: C:\Users\u\Code\ExperimentationService\file:\C:\Users\u\Code\ExperimentationService\build\libs\experimentationService-0.1.0.jar!\ApplicationInsights.xml (The filename, directory name or volume label syntax is incorrect)]

我也在 linux 环境中 运行ning 时看到同样的问题。

我可以做些什么来使 xml 文件可供解组器使用,或者这是否需要在 Application Insights 的 sdk 中更改?

您应该使用 class 加载器。

Windows:

c:\your-jar-file.jar/path/of/your/file/foo.xml

Linux:

/home/your-jar-file.jar/path/of/your/file/foo.xml

代码

InputStream is = this.getClass().getClassLoader().getResourceAsStream("path/of/your/file/foo.xml");

这看起来像是 SDK 中的错误。我使用调试器逐步执行 SDK 代码,它实际上在 jar 中找到了文件,只是无法读取它(如 this question 所述,它不存在于文件系统中,而是存在于 jar 中) .

同时您可以尝试的一件事是将 XML 文件放在与 jar 相同的目录中(SDK 将检查它是否有配置文件)。我碰巧认识 AppInsights 团队 - 我会跟进他们,看看我们是否可以发布修复程序。当我发现更多时会编辑问题。

编辑:

我与 AppInsights Java SDK 团队进行了交谈。该错误已修复,下周应该会与新版本一起发布。

编辑:

这是公关:https://github.com/Microsoft/ApplicationInsights-Java/pull/257