2014-04-06 128 views
1

使用spring-boot和thymeleaf构建应用程序。在IntelliJ中一切正常,但是当我通过“gradle clean build”构建时,则会出现错误。百里香叶片上的百里香失败

这是我的目录结构:

src 
- generated 
- main 
-- java 
-- resources 
--- assets 
---- css/js 
---- templates 
----- *.html 
-- webapp 
- test 
-- groovy 
--- unit & integration tests here 
-- resources 
-- unit 

这是我的gradle文件:

apply plugin: 'java' 
apply plugin: 'groovy' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 
apply plugin: 'jacoco' 
apply plugin: 'war' 
apply plugin: 'maven' 

def generatedResources = "$buildDir/generated-resources/main" 

configurations { 
    querydslapt 
} 

buildscript { 
    repositories { 
     maven { url "http://repo.spring.io/libs-snapshot" } 
     mavenLocal() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4") 
    } 
} 


repositories { 
    mavenCentral() 
    maven {url "http://repo.spring.io/libs-snapshot"} 
    maven {url 'http://repo.spring.io/milestone' } 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:1.0.0.RELEASE") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.1.RELEASE") 
    compile("org.springframework.boot:spring-boot:1.0.1.RELEASE") 
    compile("org.springframework:spring-orm:4.0.0.RC1") 
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final") 
    compile("com.h2database:h2:1.3.172") 
    compile("joda-time:joda-time:2.3") 
    compile("org.thymeleaf:thymeleaf-spring4") 
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1") 
    compile('org.codehaus.groovy:groovy-all:2.2.1') 
    compile('org.jadira.usertype:usertype.jodatime:2.0.1') 
    compile('com.mysema.maven:maven-apt-plugin:1.0.2') 
    compile('com.mysema.querydsl:querydsl-apt:3.3.2') 
    compile('com.mysema.querydsl:querydsl-jpa:3.3.2') 

    querydslapt "com.mysema.querydsl:querydsl-apt:3.3.2" 
    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') { 
     exclude group: 'org.codehaus.groovy', module: 'groovy-all' 
    } 
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+') 
    testCompile("junit:junit") 
} 

jacocoTestReport { 
    group = "Reporting" 
    description = "Generate Jacoco coverage reports after running tests." 
} 

sourceSets { 

    generated { 
     java { 
      srcDirs = ['src/main/generated'] 
     } 
    } 
    main { 
     //let's register an output folder on the main SourceSet: 
    output.dir(generated, builtBy: 'generateQueryDSL') 
     java { 
      srcDirs = [] 
     } 
     groovy { 
      srcDirs = ['src/main/groovy', 'src/main/java'] 
     } 
     resources { 
      srcDirs = ['src/main/resources'] 
     } 

     output.resourcesDir = "build/classes/main" 
    } 

    test { 
     java { 
      srcDirs = [] 
     } 
     groovy { 
      srcDirs = ['src/test/groovy', 'src/test/java'] 
     } 
     resources { 
      srcDirs = ['src/test/resources'] 
     } 

     output.resourcesDir = "build/classes/test" 
    } 
} 


task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') { 
    source = sourceSets.main.java 
    classpath = configurations.compile + configurations.querydslapt 
    options.compilerArgs = [ 
      "-proc:only", 
      "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor" 
    ] 
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next() 
} 

compileJava { 
    dependsOn generateQueryDSL 
    source generateQueryDSL.destinationDir 
} 

compileGeneratedJava { 
    dependsOn generateQueryDSL 
    options.warnings = false 
    classpath += sourceSets.main.runtimeClasspath 
} 

clean { 
    delete sourceSets.generated.java.srcDirs 
} 

idea { 
    module { 
     sourceDirs += file('src/main/generated') 
    } 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '1.11' 
} 

我有UI配置为这样:

@Configuration 
public class MvcConfig extends WebMvcConfigurerAdapter { 
... 
    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/home").setViewName("index"); 
    ... 
    } 

// removed to try and find the css/js/images 
//@Override 
//public void addResourceHandlers(ResourceHandlerRegistry registry) { 
// registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
//}  

... 
} 

下面是一个例子测试:

@SpringApplicationConfiguration 
class TreasuryStatusEvaluatorTest extends Specification { 

    @Shared 
    def ConfigurableApplicationContext context 

    @Shared 
    private StatusRepository statusRepository 

    void setupSpec() { 
     Future future = Executors.newSingleThreadExecutor().submit(
       new Callable() { 
        @Override 
        public ConfigurableApplicationContext call() throws Exception { 
         return (ConfigurableApplicationContext) SpringApplication.run(OFAC.class) 
        } 
       }) 
     context = future.get(60, TimeUnit.SECONDS) 
     treasuryStatusEvaluator = context.getBean(TreasuryStatusEvaluator.class) 
     statusRepository = context.getBean(StatusRepository.class) 
    } 

    void cleanupSpec() { 
     if (context != null) { 
      context.close() 
     } 
    } 
... 
} 

这里是一个典型的HTML页面:内的IntelliJ或作为应用程序一切正常运行

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    <meta name="description" content=""/> 

    <link href="/resources/static/css/bootstrap.css" rel="stylesheet"/> 
    <link href="/resources/static/css/bootstrap.min.css" rel="stylesheet"/> 
    <link href="/resources/static/css/bootstrap-responsive.css" rel="stylesheet"/> 
    <link href="/resources/static/css/bootstrap-responsive.min.css" rel="stylesheet"/> 
    <link href="/resources/static/css/ofac.css" rel="stylesheet"/> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"/> 

    <!-- HTML5 shim, for IE6-8 support of HTML5 elements --> 
    <!--[if lt IE 9]> 
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
</head> 
<body> 
<div id="wrap"> 
... 

<script src="/resources/static/js/libs/jquery.min.js"></script> 
<script src="/resources/static/js/libs/bootstrap/bootstrap.min.js"></script> 
</body> 
</html> 

这些测试。但是,当我运行命令行的测试中,我得到的错误,如:

Caused by: java.lang.IllegalStateException: Cannot find template location: class path resource [templates/] (please add some templates or check your Thymeleaf configuration) 

我看到,在春季启动有与thymeleaf目录结构的问题:https://github.com/spring-projects/spring-boot/issues/424和它似乎是一个模板目录是必须的。我没有使用任何模板,只是HTML。

更新#1: 我感动的HTML下的src /主/资源/ *

更新#2: 我感动的CSS/JS /库为src /主/资源/静 我试过把它们放在src/main/static下,但是那也行不通

+0

有你尝试过使用1.0.0.RELEASE版本的spring-boot?我看到了RC之间的一些重大变化。我仍然理解springboot autoconfig自己,但如果你使用starter-web,它可能会在src/main/resources/templates中查找视图文件。不知道如何intellij工作,虽然可能一些额外的配置是在intellij正确完成。请参阅:http://stackoverflow.com/questions/22770220/spring-boot-templates-not-resolved?rq=1 – vasya10

回答

4

现在有一个1.0.1.RELEASE的Spring Boot,所以你应该使用它(它可能只是解决你的问题) 。不过,通常情况下,只要将模板放入“classpath:/ templates”(这些html文件是Thymeleaf所称的“模板”),我不会期望您需要Thymeleaf配置。如果您想将它们放在其他地方,请使用spring.thymeleaf.prefix指定模板位置(请参阅docs here)。

如果您希望自己完全配置Thmyeleaf,那么您需要使用模板解析器(“defaultTemplateResolver”)的常规bean名称,以便Boot知道您在做什么。详细信息在ThymeleafAutoConfiguration - 文档中明确提出了一些功能,但似乎并非如此。

+0

所以我改变了到1.0.1.RELEASE,移动了我所有的html,样式表,并移除了Bean templateResolver和Bean templateEngine。查看上面更新的问题。但是,无论我将它们放在/ src/main/resources /下,现在都不会显示CSS/JS /图像。我现在遇到了诸如“NetworkError:404 Not Found - ”http:// localhost:9001/resources/assets/css/bootstrap-responsive.min.css等错误。当Web资产位于WEB-INF /下时,tomcat可以找到他们,但现在这些资源,减去HTML文件,找不到 – sonoerin

+0

你检查了[文档](http://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/htmlsingle /#boot-features-spring-mvc-static-content)?我更喜欢“src/main/resources/static”,但这取决于你。 –

+0

谢谢你的文档链接,我认为它证实我有我的资产在正确的位置(/ src/main/resources/static/css ...)。我没有定义ServletContext,所以我认为这意味着我的html应该查看js/css/etc的根目录。我定义的路径,或者我把资源放在哪里都找不到,我用一个不能找到css或javascript的示例html更新了我的问题。 – sonoerin

2

如果你得到同样的异常

Caused by: java.lang.IllegalStateException: Cannot find template location: class path resource [templates/] (please add some templates or check your Thymeleaf configuration) 

但使用SpringBoot 1.2.0-RELEASE,它可能是简单的,你需要创建一个目录的src /主/资源/模板。

我从SpringBoot 1.1.9升级到1.2.0并开始得到这个异常。添加目录修复它。

-1

或者,如果您收到此例外情况并且不想使用thymeleaf,则可以通过使用...

配置/ application.yml

spring.groovy.template.check-template-location: false 

更多春天的最新版本,实际上会告诉你这堆栈跟踪...

Caused by: java.lang.IllegalStateException: Cannot find template location: classpath:/templates/ (please add some templates, check your Groovy configuration, or set spring.groovy.template.check-template-location=false)