spring 如何在jar依赖中读取war-file manifest?

smdncfj3  于 2023-05-12  发布在  Spring
关注(0)|答案(2)|浏览(106)

如何在jar-dependency中读取war-file manifest属性?
UPD:这里没有使用servlet(它是spring-bean初始化代码)。

kuuvgm7e

kuuvgm7e1#

因为.war文件的目的是处理servlet,所以我假设您的所有代码都是从servlet调用的,或者是从构建在servlet上的技术调用的,比如JSP、JSF,甚至是Spring。
调用当前请求的getServletContext()方法,并使用ServletContext的getResource或getResourceAsStream方法。这些方法的工作方式与java.lang.Class的方法相同,只是它们在搜索Web应用程序的类路径以找到匹配路径之前先查看.war文件本身。
例如:

public Optional<Manifest> getWarManifest(ServletRequest request)
throws IOException {

    InputStream manifest =
        request.getServletContext().getResourceAsStream(
            "/META-INF/MANIFEST.MF");

    if (manifest == null) {
        return Optional.empty();
    }

    try (InputStream stream = new BufferedInputStream(manifest)) {
        return Optional.of(new Manifest(stream));
    }
}

更新:

由于您希望在准备Spring bean时读取清单,因此显示you can autowire a ServletContext object

@Configuration
public class MyAppConfig {
    @Bean
    public MyBean createMyBean(@Autowired ServletContext context)
    throws IOException {

        Optional<Manifest> manifest;

        InputStream source =
            context.getResourceAsStream("/META-INF/MANIFEST.MF");

        if (source == null) {
            manifest = Optional.empty();
        } else {
            try (InputStream stream = new BufferedInputStream(source)) {
                manifest = Optional.of(new Manifest(stream));
            }
        }

        return new MyBean(manifest);
    }
}
5vf7fwbs

5vf7fwbs2#

可能还有其他方法...如果您可以更改WAR文件的构建配置,那么您可以简单地将所有构建属性添加到一个可访问位置的不同文件中。例如:

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.directory}/classes/maven.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>

之后,您可以从它访问所有需要的信息,而不必担心Manifest文件。

相关问题