EAR classloader не видит ApplicationInsights.xml, расположенный в jar - PullRequest
0 голосов
/ 26 марта 2019

У меня следующая проблема: я пытаюсь развернуть конфигурацию телеметрии Azure в файле jar, который находится в файле war внутри основного уха. К сожалению, во время запуска сервера возникают ошибки, так как ApplicationInsights.xml не может быть найден. Я отладил его и обнаружил, что он не может быть прочитан com.microsoft.applicationinsights.internal.config.ConfigurationFileLocator.getConfigurationFile ().

Есть структура моего модуля:

azure
|_ src
   |_ main
         |_ java
         |     |_ mypackage
         |                |_ MicrometerRegistryConfigurationListener.java
         |_ resources
                    |_ ApplicationInsights.xml

Существует MicrometerRegistryConfigurationListener.java:

@WebListener
public class MicrometerRegistryConfigurationListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        MeterRegistry azureMeterRegistry = new AzureMonitorMeterRegistry(new AzureMonitorConfig() {
            @Override
            public String get(String key) {
                return null;
            }

            @Override
            public Duration step() {
                return Duration.ofSeconds(5);
            }
        }, Clock.SYSTEM);

        new JvmThreadMetrics().bindTo(azureMeterRegistry);
        new JvmMemoryMetrics().bindTo(azureMeterRegistry);
        new JvmGcMetrics().bindTo(azureMeterRegistry);

        servletContextEvent.getServletContext().setAttribute("AzureMonitorMeterRegistry", azureMeterRegistry);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

А есть структура уха:

ear
  |_ war
       |_ WEB-INF/lib
                    |_ azure.jar
                               |_ ApplicationInsights.xml

Конечно, azure.jar содержит также классы, т.е. MicrometerRegistryConfigurationListener.

Что происходит? Почему ApplicationInsights.xml не отображается?

1 Ответ

0 голосов
/ 27 марта 2019

Потому что jar - это файл, а не папка.Загрузчик пытается получить доступ к пути файловой системы, но не может получить доступ к пути в вашем JAR.Таким образом, вы можете использовать метод resource.getInputStream(), чтобы получить его как InputStream.Вы можете получить подробности из этого документа: Java: загрузить файл из classpath в Spring Boot .

Пример кода:

public class EnvResolver {
private ResourceLoader resourceLoader;
public EnvResolver(){
    resourceLoader = new DefaultResourceLoader();
}
public List GetEnvConfig() throws IOException {
    Yaml yaml = new Yaml();
    Resource resource = resourceLoader.getResource("classpath:test-environment.yml");
    System.out.println("FileName: " + resource.getFilename());
    InputStream inputStream = resource.getInputStream();
    Map<String, Map<String, String>> result = yaml.load(inputStream);
    List<TestEnvVo> envList = new ArrayList<>();
    for (String key : result.keySet()) {
        TestEnvVo testEnvVo = new TestEnvVo();
        testEnvVo.setEnvName(result.get(key).get("name"));
        testEnvVo.setDomain(result.get(key).get("domain"));
        envList.add(testEnvVo);
    }
    inputStream.close();
    return envList;
}
}

После поиска я нашел другой способнастройте его, в вашем файле POM добавьте конфигурацию resources.Вы можете попробовать.

<resources>
    <resource>
        <directory>src/main/resource</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
            <include>**/*.tld</include>
        </includes>
        <filtering>false</filtering>
    </resource>
</resources>

Надеюсь, это поможет вам.

ОБНОВЛЕНИЕ:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class Hello {

    public static void main(String[] args) throws IOException {
        InputStream resourceInputStream = null;
        URL resourceURL = Hello.class.getClassLoader().getResource("resources/hello.json");
        if(resourceURL == null) {
            System.out.println("Get the InputStream of file in IDE");
            resourceInputStream = new FileInputStream(Hello.class.getClassLoader().getResource("").getPath()+"../../src/main/resources/hello.json");
        } else {
            System.out.println("Get the InputStream of file from runnable jar");
            resourceInputStream = Hello.class.getClassLoader().getResourceAsStream("resources/hello.json");
        }
        System.out.println();
        StringBuilder builder = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(resourceInputStream));
        String line = null;
        while((line = br.readLine()) != null) {
            builder.append(line+"\n");
        }
        br.close();
        System.out.println(builder.toString());
    }
    }
...