2012-10-02 3 views
5

이 소스 (예 : 프로젝트 a)에서 Java 소스와 jar 세트를 생성하는 작업이 있습니다. 이 jar 파일을 종속 프로젝트 (예 : b 프로젝트)로 내보내고 싶습니다. 종속성이 아직 생성에는 항아리가 없을 때 generateJars 작업을 실행해야한다는 Gradle을 말하지 않는 한 그것은 그 추가 generateJars.outputs.files 제외하고, 확인을 작동Gradle - 프로젝트 종속성에 작업의 출력을 포함 할 수 있습니까?

//a.gradle 

configurations{ 
    generatedJars 
} 

task generateJars(type: JavaExec) { 
    //generate jars ... 

    outputs.files += //append generated jars here 
} 

dependencies{ 
    generatedJars generateJars.outputs.files 
} 


//b.gradle 

dependencies{ 
    project(path: ':a', configuration: 'generatedJars') 
} 

: 그래서 여기에 내가 지금 무슨 약입니다. 작업 자체를 종속성으로 추가하려고 시도했습니다. 예를 들어, 유물 구성 (예 : artifacts{ myJarTask })에 jar/zip 작업을 추가 할 때와 동일한 방식으로 작동하지만, 수행 할 수 없다는 오류가 발생합니다. 그. 물론 :b이 평가되기 전에 generateJars 작업을 빌드 프로세스의 어딘가에 삽입 할 수는 있지만 어색하고 취약하기 때문에이를 피하고 싶습니다.

생성 된 jars를 프로젝트의 artifacts{ ... }에 추가해야한다고 생각하지만, 종속 프로젝트에 표시하는 방법을 잘 모르겠습니다. 이것을 성취 할 수있는 더 좋은 방법이 있습니까?

종속 프로젝트 (프로젝트 b)는 프로젝트 a의 생성 된 jar를 가리 키도록 IntelliJ IDEA 모듈 클래스 경로 설정을해야합니다. 오히려이 (의사 코드) 같은 것을 : 지금까지 내가 :ageneratedJars:b에서의 프로젝트 실행 종속을 추가 단순히 시도하지만, 아이디어 플러그인은 단순히 모듈 종속성으로 모듈 :a를 추가하고 있다고 가정

//b.gradle 

idea{ 
    module{ 
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files 
    } 
} 

을 생성 된 jar 파일을 내 보냅니다 (올바른 가정 일 수 있음). 따라서 생성 된 jar 파일을 :b의 classpath에 추가하지 마십시오.

도움이 될 것입니다.

답변

2

먼저 별도의 구성이 필요합니까? 즉, a의 클라이언트가 있습니까? 이 아닌 생성 된 Jars를 확인 하시겠습니까? 그렇지 않은 경우 생성 된 Jar 파일을 archives 구성에 추가하면 단순화됩니다.

둘째, 구성에 생성 된 항아리를 추가 할 수있는 올바른 방법은 (대신 dependencies 블록의)입니다 :

artifacts { 
    generatedJars generateJars 
} 

이 필요할 때 generateJars 작업이 자동으로 실행됩니다 있는지 확인해야합니다.

셋째, outputs.files 이후에 +=을 생략 하겠지만 차이는 없습니다. 또한 필요한 입력을 추가해야합니다.

넷째, 왜 Jars 생성을 위해 JavaExec 작업이 필요합니까? 대신 생성 된 소스를 일부 소스 세트에 추가하고 Gradle이 소스 세트를 빌드하도록 할 수 있습니까?

다섯째, IDEA에는 Gradle의 프로젝트 구성 종속성에 해당하는 개념이 없습니다. IDEA 모듈은 완전히 다른 모듈에 의존하거나 전혀 의존하지 않습니다. 두 가지 옵션이 있습니다. 모듈 종속성을 사용하고 생성 된 소스를 종속 모듈의 소스 폴더로 만들고 (바람직하게는 Gradle과 IDEA 빌드 모두에서) 생성 된 Jars를 외부 종속성으로 IDEA에 전달하십시오.두 경우 모두 ideaModule의 작업 종속성을 적절한 생성 작업에 추가해야합니다. 여전히 만족스러운 IDEA 설정으로 이어지지 않는다면, Jar 생성을 별도의 하위 프로젝트로 옮기는 것에 대해 생각할 수 있습니다.

+0

감사합니다. 'artifacts '에 태스크를 추가하는 것은 모듈 내에서 훌륭하게 작동하지만, 프로젝트 b에서 (프로젝트를 공개하지 않고) 어떻게 그 jar를 참조 할 수 있는지 알지 못합니다. 예, 소스를 생성하여 모듈 소스로 내보낼 수 있습니다. 이것은 효과가 있지만 IDEA를위한 추가 작업을 생성하므로 어떻게 든 피할 수 있기를 바랬습니다. 'ideaModule -> generateJars' 후킹을 잘하려면'b : ideaModule -> a : ideaModule'을 추가해야하며,이 작업을 수행하는 데 필요한 모듈이 약 3 개 있습니다. 어떻게 든 자동 해상도로 설정할 수 있기를 바랬습니다. – rodion

+0

광고 1. '프로젝트 (경로 :'a ', 구성 :'생성 된 Jars ')' –

+0

광고 2. '추가 작업'에 문제가 있습니까? (생성되지 않은 코드에 대해 동일한 인수를 사용할 수 있습니다.) 어쨌든 JavaExec 작업보다는 Gradle을 사용하여 파일을 컴파일해야합니다. –

관련 문제