Duplicate files in Gradle -built.war file

I have a problem with duplicate files with my Gradle build script construct.

My directory structure is the maven standard, as well as several additional directories for various build configurations:

/src/main/java /src/main/resources /src/main/dev/resources /src/main/prod/resources 

Files from /src/main/resources and /src/main/dev/resources are apparently processed by both the processResources and war tasks, and end up in the .war file twice. How can I prevent this without manually excluding every single file in the war configuration?

All of my build.gradle is included below; note buildEnvironment is set to dev by default, but can also be prod .

 apply plugin: "sonar" apply plugin: "war" apply plugin: "eclipse-wtp" // ************************************************************************************************ // GENERAL CONFIGURATION // ************************************************************************************************ sourceCompatibility = 1.6 group = "com.foo" archivesBaseName = "security" version = "0.1-SNAPSHOT" // versions of various components where we need more than one and may want to update often def springVersion = "3.1.1.RELEASE" def tomcatVersion = "7.0.25" def jasperVersion = "4.5.0" // buildEnvironment is set in gradle.properties and can be overridden with -PbuildEnvironment=... on the command line println "running in $buildEnvironment mode..." // set classes output directory to WEB-INF/classes eclipse.classpath.defaultOutputDir = new File(project.getWebAppDir().getAbsolutePath(), "/WEB-INF/classes") // ************************************************************************************************ // SOURCE SETS // ************************************************************************************************ sourceSets { // add the resources specific to the build environment main.resources.srcDirs += "src/main/$buildEnvironment/resources" // add source set for jasper reports jasperreports { srcDir = file(relativePath('src/main/jasperreports')) output.classesDir = file(relativePath('src/main/java/com/foo/bar/security/statistics')) } } // ************************************************************************************************ // PLUGINS // ************************************************************************************************ buildscript { repositories { add(new org.apache.ivy.plugins.resolver.URLResolver()) { name = 'GitHub' addArtifactPattern 'http://cloud.github.com/downloads/[organisation]/[module]/[module]-[revision].[ext]' } } dependencies { classpath 'bmuschko:gradle-tomcat-plugin:0.9' } } apply plugin: "tomcat" // ************************************************************************************************ // PLUGIN CONFIGURATION // ************************************************************************************************ // configure eclipse .project/.classpath generator eclipse { project { natures 'com.springsource.sts.gradle.core.nature' } wtp { component { contextPath = "/security" } } } configurations { // make sure we don't get dependencies we don't want all*.exclude group: "net.sf.ehcache", module: "ehcache-terracotta" all*.exclude group: "bouncycastle", module: "bcmail-jdk14" all*.exclude group: "bouncycastle", module: "bcprov-jdk14" all*.exclude group: "bouncycastle", module: "bctsp-jdk14" // wtp needs a special invitation for some reason eclipseWtpComponent { exclude group: "net.sf.ehcache", module: "ehcache-terracotta" } jasperreports { transitive = true } } // maven repositories repositories { maven { url "http://maven.springframework.org/milestone/" } mavenCentral() } // sonar configuration sonar { server { url = "http://xxx" } database { url = "jdbc:mysql://xxx" driverClassName = "com.mysql.jdbc.Driver" username = "xxx" password = "xxx" } project { key = "foo.bar:security" } } war { // set war output file name archiveName = "security.war" // make sure no duplicate processing of files takes place excludes += [ "**/database.properties", "**/logback.xml", "**/rebel.xml", "**/upload.properties", "**/ValidationMessages.properties" ] } tomcatRun { contextPath = "/security" } // ************************************************************************************************ // DEPENDENCIES // ************************************************************************************************ dependencies { // exclusions for jasperreports, which tries to load old versions of stuff compile("net.sf.jasperreports:jasperreports:$jasperVersion") { exclude module: "jfreechart" exclude module: "jcommon" } // exclusions for ehcache, we don't want their enterprise cache compile("net.sf.ehcache:ehcache:2.5.1") { exclude group: "net.sf.ehcache", module: "ehcache-terracotta" } // compile and runtime dependencies compile "org.springframework:spring-webmvc:$springVersion", "org.springframework:spring-orm:$springVersion", "org.springframework:spring-aspects:$springVersion", "org.springframework.mobile:spring-mobile-device:1.0.0.RC1", "org.jfree:jfreechart:1.0.14", "org.apache.tiles:tiles-jsp:2.2.2", "c3p0:c3p0-oracle-thin-extras:0.9.1.2", "org.mybatis:mybatis-spring:1.0.2", "org.aspectj:aspectjrt:1.6.12", "org.aspectj:aspectjweaver:1.6.12", "org.codehaus.jackson:jackson-mapper-asl:1.9.4", "ch.qos.logback:logback-classic:1.0.0", "org.slf4j:jcl-over-slf4j:1.6.4", "org.slf4j:log4j-over-slf4j:1.6.4", "org.slf4j:jul-to-slf4j:1.6.4", "org.hibernate:hibernate-validator:4.2.0.Final", "com.google.guava:guava:11.0.1", "commons-dbutils:commons-dbutils:1.4", "commons-fileupload:commons-fileupload:1.2.2", "commons-io:commons-io:2.1", "commons-lang:commons-lang:2.6", "org.bouncycastle:bcprov-jdk16:1.46", "org.quartz-scheduler:quartz:2.1.3", "jdom:jdom:1.1", "cglib:cglib:2.2.2", "org.jasypt:jasypt:1.9.0", "com.sun.mail:smtp:1.4.4", "com.sun.mail:mailapi:1.4.4", "xalan:xalan:2.7.1", "org.jdom:saxpath:1.0-FCS" runtime "javax.servlet:jstl:1.2" // for compiling jasper reports jasperreports "net.sf.jasperreports:jasperreports:$jasperVersion", "org.codehaus.groovy:groovy-all:1.8.6" } // dependencies for each tomcat version, which are in different packages for 6.x and 7.x, sigh println "adding dependencies for Tomcat $tomcatVersion" if (tomcatVersion.startsWith("6")) { dependencies.add("providedCompile", "org.apache.tomcat:catalina:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:catalina:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:coyote:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:jasper:$tomcatVersion") } else if (tomcatVersion.startsWith("7")) { dependencies.add("providedCompile", "org.apache.tomcat:tomcat-catalina:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:tomcat-catalina:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:tomcat-coyote:$tomcatVersion") dependencies.add("tomcat", "org.apache.tomcat:tomcat-jasper:$tomcatVersion") } // ************************************************************************************************ // JASPER REPORTS // ************************************************************************************************ task jasperReports(overwrite: true) << { ant { taskdef(name: 'jrc', classname: 'net.sf.jasperreports.ant.JRAntCompileTask', classpath: configurations.jasperreports.asPath) mkdir(dir:sourceSets.jasperreports.output.classesDir) jrc(srcdir: sourceSets.jasperreports.srcDir, destdir: sourceSets.jasperreports.output.classesDir) { include(name:'**/*.jrxml') classpath { pathElement(path: configurations.jasperreports.asPath) } } } } task cleanJasperReports(overwrite: true) << { ant.delete() { fileset(dir:sourceSets.jasperreports.output.classesDir, includes: "*.jasper") } } compileJava.dependsOn jasperReports 
+6
source share
1 answer

I have not tested your configuration here, but I think because you add main.resources.srcDirs += "src/main/$buildEnvironment/resources" in sourceSets. By adding this, you have the following source codes if buildEnvironment = 'dev' :

  • SRC / Basic / Java
  • Src / core / resources
  • Src / core / dev / resources

This means that if you have a resource named myfile.txt in src/main/resources and src/main/dev/resources , you will get the following files:

  • WEB-INF / classes / myfile.txt
  • WEB-INF / classes / DEV / myfile.txt

To fix this, you can simply move dev / prod resources outside of src/main , for example. eg:

  • SRC / Basic / Java
  • Src / core / resources
  • Src / dev / resources
  • Src / prod / resources

Instead, use the following sourceSet:

 main.resources.srcDirs += "src/$buildEnvironment/resources" 

Then all dev / prod resources override the resources in src/main/resources .

+3
source

Source: https://habr.com/ru/post/908982/


All Articles