Java 是否可以交替地动态使用多个项目中的Freemarker模板?

Java 是否可以交替地动态使用多个项目中的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

我有两个项目ProjectA是一个Spring引导应用程序,主要关注编辑和更新信息项目B有查看信息的方法,我正试图将此作为(a)的依赖项,以最大限度地提高代码重用率,并将修复任何错误/进行多次改进的工作降至最低

我希望能够让我的控制器和模板正确地动态找到正确的模板

项目A正确地利用了项目B依赖项中包含的任何服务/DAO等,但我在前端处理方面遇到了问题。在过去,我有一个项目没有自己的前端使用第二个项目中定义的模板。这很简单,只需在我的配置中的Freemarker
@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!比我最初的想法更好,手动复制依赖模板,只是偶尔要做,以确保它是最新的。从来没有想过在一个构建上自动化。。。