Java 是否可以交替地动态使用多个项目中的Freemarker模板?
我有两个项目ProjectA是一个Spring引导应用程序,主要关注编辑和更新信息项目B有查看信息的方法,我正试图将此作为(a)的依赖项,以最大限度地提高代码重用率,并将修复任何错误/进行多次改进的工作降至最低 我希望能够让我的控制器和模板正确地动态找到正确的模板 项目A正确地利用了项目B依赖项中包含的任何服务/DAO等,但我在前端处理方面遇到了问题。在过去,我有一个项目没有自己的前端使用第二个项目中定义的模板。这很简单,只需在我的配置中的FreemarkerJava 是否可以交替地动态使用多个项目中的Freemarker模板?,java,spring-boot,dependency-injection,freemarker,contextpath,Java,Spring Boot,Dependency Injection,Freemarker,Contextpath,我有两个项目ProjectA是一个Spring引导应用程序,主要关注编辑和更新信息项目B有查看信息的方法,我正试图将此作为(a)的依赖项,以最大限度地提高代码重用率,并将修复任何错误/进行多次改进的工作降至最低 我希望能够让我的控制器和模板正确地动态找到正确的模板 项目A正确地利用了项目B依赖项中包含的任何服务/DAO等,但我在前端处理方面遇到了问题。在过去,我有一个项目没有自己的前端使用第二个项目中定义的模板。这很简单,只需在我的配置中的Freemarker@Bean上设置正确的Templat
@Bean
上设置正确的TemplateLoaderPath
。这一次,我怀疑,一旦我调用了项目a的本地模板,它将假定在该上下文路径上也可以找到任何子数量模板,而不是在项目B中查找
我可能更容易显示项目的结构:
src/main/resources/
模板/
特点1/
f1page.ftl
特点2/
f2page.ftl
Maven依赖项
项目b.jar
模板/
特点3/
f3page.ftl
特点4/
f4page.ftl
我希望当我为我的控制器返回新的ModelAndView对象时
返回新的ModelAndView(“feature3/f3page.ftl”)代码>和
返回新的ModelAndView(“feature1/f1page.ftl”)代码>它可以工作,因为两个功能文件夹都位于不同的位置
值得一提的是,有很多模板导入正在进行,因此在这里也需要找到正确的模板。因此,如果f1page.ftl
(在src/main/resources中)有以下行:
这需要在其他位置(dependency.jar内)找到
下面是此示例中当前freemarker堆栈跟踪的示例。返回时,它似乎找到了f1page.ftl
:newmodelandview(“feature1/f1page.ftl”)代码>但未能在第2行找到导入的功能3/f3page.ftl
模板导入失败(对于参数值“/feature3/f3page.ftl”):找不到名称“/feature3/f3page.ftl”的模板。此TemplateLoader解释了该名称:MultiTemplateLoader(loader1=FileTemplateLoader(baseDir=“C:\Users\Becxxxa\ProjectA\target\classes\templates”,canonicalBasePath=“C:\Users\Becxxxa\Projects\ProjectA\target\classes\templates\”),loader2=ClassTemplateLoader(resourceLoaderClass=org.springframework.web.servlet.view.freemarker.freemarkerConfigure,basePackagePath=”“/*相对于resourceLoaderClass pkg*/)----FTL堆栈跟踪(“~”表示嵌套相关):-在以下位置失败:#导入“/f3page.FTL”作为f3[在第2行第1列的模板“feature1/f1page.FTL”中]
这是我的@Bean
,您可以看到,我已经将setPreferFileSystemAccess
应用于false
(正如建议的那样),但没有任何效果
@Bean
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration(){
FreeMarkerConfiguration FactoryBean=新的FreeMarkerConfiguration FactoryBean();
setTemplateLoaderPath(“classpath:/templates/”;
setPreferFileSystemAccess(false);
返回豆;
}
可能是我对Freemarker要求太多,而这实际上是不可能的。但如果不是这样,我需要帮助来正确配置我的项目/Freemarker,以便与两个模板源一起动态工作。我觉得我可能缺少一些关于模板加载的明显信息。多亏了@Taylor O'Connor,尽管事实并非如此我以为我在寻找一个简单的解决方案,来解决一个看似复杂的问题
最后,我使用maven依赖插件
将我需要的模板从依赖项解包到父项目的“src/main/resources/templates”文件夹中。这满足了我不必维护同一代码的多个源的要求
这是我添加到pom中的插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>uk.co.company</groupId>
<artifactId>projectA</artifactId>
<outputDirectory>src/main/resources/</outputDirectory>
<includes>templates/feature3/**</includes>
<excludes>*/feature4/*</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven依赖插件
打开
包裹
打开
英国公司
项目A
src/main/resources/
模板/功能3/**
*/特点4/*
这将feature3
文件夹放入我的templates
文件夹中。我必须排除feature4
,因为它与我的templates文件夹中已有的文件夹名称匹配,对我来说这是最好的,因为模板必须略有不同,因为其中包含我的'layout.ftl',这在应用程序之间略有不同我认为一种策略是使用maven dependency插件
解包jar,并在构建期间将其资源复制到父项目的resources文件夹中。类似于。一般来说,根据我的经验,尝试读取dependency jar的资源非常困难。有趣的策略,当然是可靠的pl一个B!比我最初的想法更好,手动复制依赖模板,只是偶尔要做,以确保它是最新的。从来没有想过在一个构建上自动化。。。