【问题标题】:How can I get Start-Class programmatically?如何以编程方式获得 Start-Class?
【发布时间】:2019-07-09 20:36:19
【问题描述】:

如何以编程方式从 BOOT-INF/lib 中的 jar 中的代码获取 Start-Class 清单属性?

我知道我可以获取 LaunchURLClassLoader,调用 getResourceAsStream("META-INF/MANIFEST.MF"),然后在 MANIFEST.MF 中查找属性,但我不确定这是最好的方法

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    您的方法很好,可能会奏效,但您可以将抽象级别提高一级并使用 Spring 的 Resource Loader

    Resource template = ctx.getResource("classpath:/path/to/manifest");
    

    【讨论】:

    • 问题是我无法访问 spring 上下文
    • ResourceLoader 将与正确的 classLoader 一起工作,并将获取类路径上可用的任何资源(包括内部 jars)。正如我所说 - 你的方法很好,但在这种情况下 ResourceLoader 将负责获取正确的类加载器。您是否测试过代码以查看它是否有效?如果它有效(您在 ResourceLoader 版本上的版本 - 没关系) - 那么您就没有问题,您可以继续前进。
    【解决方案2】:
    public class UserAgentSpringBootApplicationNameDiscoverer {
    
        protected static final String BOOT_INF_DIR = "BOOT-INF/";
    
        protected static final String MANIFEST_DIR = "META-INF/MANIFEST.MF";
    
        public String getStartClassFromClassLoader(ClassLoader cl) {
    
            URL bootInfUrl = cl.getResource(BOOT_INF_DIR);
            if (bootInfUrl == null || "".equals(bootInfUrl.toString().trim())) {
                return null;
            }
    
            String rootMetaInfUrl = bootInfUrl.toString().replace(BOOT_INF_DIR, MANIFEST_DIR);
            InputStream is = cl.getResourceAsStream(rootMetaInfUrl.toString());
            if (is == null) {
                return null;
            }
            Manifest manifest = null;
    
            try {
                manifest = new Manifest(is);
            } catch (IOException e) {
                return null;
            }
            return manifest.getMainAttributes().getValue("Start-Class");
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2016-11-19
      • 2023-03-11
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多