未为 JAR 部署加载资产 (asset-pipeline-grails)

问题描述

亲爱的,我和团队在使用 asset-pipeline-grails (https://github.com/bertramdev/asset-pipeline) 时遇到了有趣的问题:

这是一个多子项目构建,项目“A”(主要部分)依赖于项目“B”(插件)。 grails-3.0.17,asset-pipeline-gradle:2.10.0

目标是使用 assetResourceLocator.findAssetForURI("${PATH}/${fileName}") 加载位于项目“A”中的资产(资源)作为图像,根据文档 (http://www.asset-pipeline.com/manual/) 我已将新图像添加到 {{ 1}} 并且在调试 mod(使用 IntellijIDEA 启动应用程序)期间它工作正常,但在生产 mod(部署带有嵌入式 Tomcat 的 jar)它不起作用。

经过调查发现: 可以通过两种方式加载资产,如果是 WAR,如果不是

grails-app/assets/images/..

这不是战争建造,所以Resource findAssetForURI(String uri) { final Resource resource if(warDeployed) { /*code*/ } else { final List<String> contentTypes = AssetHelper.assetMimeTypeForURI(uri) final String contentType = contentTypes ? contentTypes[0] : null final String extension = AssetHelper.extensionFromURI(uri) final String name = AssetHelper.nameWithoutExtension(uri) final AssetFile assetFile = AssetHelper.fileForUri(name,contentType,extension) if(assetFile) { if(assetFile instanceof GenericAssetFile) { resource = new ByteArrayResource(assetFile.bytes) } else { /*code*/ } } } return resource } 做好

AssetHelper.fileForUri(name,extension)

默认情况下,资产插件初始化 4 个解析器:

static AssetFile fileForUri(String uri,String contentType = null,String ext = null,AssetFile baseFile = null) {
    AssetFile file
    for (resolver in AssetPipelineConfigHolder.resolvers) {
        file = resolver.getAsset(uri,ext,baseFile)
        if (file) {
            return file
        }
    }
    return null
}

据我所知,第一个在调试模式下工作,其他在资产部署为插件时(在我的情况下“B”项目也有资产并且它们工作正常)

要解决此问题,我们可以在启动应用程序时将图像从 AssetPipelineConfigHolder.registerResolver(new FileSystemAssetResolver('application',"${BuildSettings.BASE_DIR}/grails-app/assets")) AssetPipelineConfigHolder.registerResolver(new ClasspathAssetResolver('classpath','META-INF/assets','META-INF/assets.list')) AssetPipelineConfigHolder.registerResolver(new ClasspathAssetResolver('classpath','META-INF/static')) AssetPipelineConfigHolder.registerResolver(new ClasspathAssetResolver('classpath','META-INF/resources')) 复制到 grails-app/assets/images/ 或使用直接路径 META-INF/assets 初始化新的解析器。

gradle.build 项目 A:

AssetPipelineConfigHolder.registerResolver(new ClasspathAssetResolver('classpath','assets'))

gradle.build 项目 B:

assets {
    minifyJs = false
    minifyCss = true
    configOptions = [commonJs: false]
}

另外,我用新版本的插件检查过,这部分的代码看起来一样

是否有针对 JAR 的现成解决方案或任何其他可能的解决方案?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)