2013-07-25 2 views
4

WAR 플러그인 작업의 리소스 파일을 Gradle로 바꾸려고합니다.Gradle이 리소스 파일을 WAR 플러그인으로 바꿉니다.

은 기본적으로 저는 두 리소스 파일이 있습니다

database.properties 
database.properties.production 

는 내가 달성하고자하는 교체입니다 'database.properties'WEB에서 최종 WAR 파일에 'database.properties.production'와 -INF/classes. 이 (

war { 
     webInf { 
      from ('src/main/resources') { 
       exclude 'database.properties' 
       rename('database.properties.production', 'database.properties') 
       into 'classes' 
      } 
     } 
    } 

을하지만 다른 모든 리소스 파일이 중복 database.properties 포함, 중복으로 발생합니다

나는 많은 것들을 시도했지만 나에게 가장 논리적 인 작동하지 않습니다 다음이었다 같은 이름을 가진 다른 파일들) 그리고 여전히 database.properties.production은 WAR에 있습니다.

중복이없고 WAR에서 database.properties.production이없는 깨끗한 솔루션이 필요합니다.

답변

6

당신은 eachFile는 당신의 최선의 방법이 될 수있다 (환경 별 구성을 다루는 권장되는 가장 좋은 방법입니다) 런타임에 결정을 할 수없는 경우

war { 
    rootSpec.eachFile { details -> 
     if (details.name == "database.properties") { 
      details.exclude() 
     } else if (details.name == "database.properties.production") { 
      details.name = "database.properties" 
     } 
    } 
} 

PS : Gradle을 1.7 filesMatching(pattern) { ... } 추가를 이는 eachFile보다 우수하게 수행 될 수 있습니다.

+0

그냥 시도하고 작동하지 않는 Gradle을 1.11으로이 솔루션을 테스트했다. 그것은 효과가없는 것 같습니다. : S –

+0

코드를 업데이트하여 제대로 작동하는지 확인했습니다. 요컨대, 기존 구성 (이 경우에는 'war' 플러그인으로 수행되는 구성)을 변경하는 것이 필요에 맞지 않습니다. 까다로울 수 있습니다. 때로는 문제를 다르게 해결하는 것이 좋습니다. 이 경우, 하나의 대안은'processResources.doLast' {...}에서 "잘못된"파일을 삭제하고 다른 파일의 이름을 바꾸는 것입니다. 또는 파일을'src/main/resources'가 아닌 다른 곳에 넣고 필요할 때 수동으로 포함시킬 수 있습니다 ('war.webInf.from ...'). 가장 적합한 솔루션은 정확한 요구 (IDE 통합 등)에 달려 있습니다. –

+0

효과가있었습니다. 감사. 이 방법을 선택하는 이유는 최소한의 작업이 필요했기 때문입니다. 나는 별도의 위치에 속성을 유지하고 싶지 않습니다. 이 방법을 사용하면 IDE로 작업 할 때 코드에서 database.properties에 테스트 데이터베이스가 표시되고 WAR를 생성 할 때 프로덕션 데이터베이스를 설정한다는 것을 알 수 있습니다. –

1

여러 아카이브 작업에 적합한 솔루션을 원할 경우 processResources 태스크를 실행 한 후 "build/resources/main"에서 등록 정보 파일을 수정할 수 있습니다. 이것이 받아 들여지는 연습인지 확실하지 않습니다. 빌드 폴더에서 생성 된 두 개의 아카이브 작업, jar 및 par로 작업하므로이 작업이 저에게 효과적이었습니다.

또한 다음 솔루션에서는 ".production"으로 끝나는 모든 파일을 사용합니다.

나는

classes << { 
    FileTree tree = fileTree(dir: "build/resources/main").include("*.production") 
    tree.each { File file -> 
     String origName = file.name.substring(0, file.name.length() - ".production".length()) 
     File orig = new File(file.getParent(), origName) 
     orig.delete() 
     file.renameTo(orig) 
    } 
} 
관련 문제