如何解决未为 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 举报,一经查实,本站将立刻删除。