2017-02-14 4 views
9

Java 라이브러리를 작성 중이므로 Gradle을 사용하여 라이브러리를 빌드 한 다음 로컬 테스트 프로젝트에서 테스트하고 싶습니다.Gradle throw로 빌드 된 Java 라이브러리 포함 NoClassDefFoundError

나는 내 목표를 위해 Gradle 3.3을 선호한다. 라이브러리는 Java5 이상으로 빌드해야합니다. 라이브러리의

plugins { 
    id 'jvm-component' 
    id 'java-lang' 
} 

repositories { 
    mavenCentral() 
} 

model { 
    components { 
    main(JvmLibrarySpec) { 
     sources { 
     java { 
      dependencies { 
      module 'commons-codec:commons-codec:1.10' 
      module 'org.apache.httpcomponents:httpcore:4.4.6' 
      module 'org.apache.httpcomponents:httpclient:4.5.3' 
      } 
     } 
     } 

     api { 
     exports 'io.simplepush' 
     } 

     targetPlatform 'java5' 
    } 
    } 
} 

소스 코드가 src/main/java/io/simplepush/Notification.java에 위치하고 있으며 build.gradle 파일에 언급 된 의존성에 따라 달라집니다

지금까지 내 build.gradle은 다음과 같습니다.

./gradlew build으로 라이브러리를 빌드하면 build/jars/main/jar/main.jar이 생성됩니다.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpEntity : 나는 (테스트 프로젝트에 main.jar를 포함한 후) 인 IntelliJ에서 테스트 프로젝트를 실행할 때

그러나, 나는 다음과 같은 런타임 오류가 발생합니다.

테스트 프로젝트가 내 라이브러리에 필요한 런타임 종속성에 대해 알지 못하는 것 같습니다.

내 프로젝트의 의존성에 대해 테스트 프로젝트에 알리는 올바른 방법이 무엇인지 잘 모르겠습니다. 모든 종속성을 포함하는 팻 (fat jar)을 원하지 않습니다.
테스트 프로젝트 자체의 모든 종속성 나열도 옵션이 아닙니다.
바람직하게는 라이브러리 자체가 테스트 프로젝트에 필요한 종속성을 알리고 싶습니다.

+0

왜 라이브러리 테스트를 라이브러리 자체에 추가하지 않습니까? –

+0

Gradle을 사용하여 프로젝트에 라이브러리를 포함시키는 과정에 대해 배우고 싶습니다. – tymm

+0

아마도이 질문에 대한 대답이 도움이 될 것입니다. http://stackoverflow.com/questions/24975745/gradle-dependencies-compile-project-by-relative-path – vinegarbin

답변

2

여러 가지를 변경하여 해결했습니다.
올바른 방향으로 나를 가리켜 주신 덕분에 @Babl에게 감사드립니다.
내 새로운 라이브러리 build.gradle은 다음과 같습니다

plugins { 
    id 'java' 
    id 'maven-publish' 
} 

sourceCompatibility = 1.5 

repositories { 
    mavenLocal() 
    mavenCentral() 
} 

dependencies { 
    compile 'commons-codec:commons-codec:1.10' 
    compile 'org.apache.httpcomponents:httpcore:4.4.6' 
    compile 'org.apache.httpcomponents:httpclient:4.5.3' 
} 

publishing { 
    publications { 
    maven(MavenPublication) { 
     groupId 'io.simplepush' 
     artifactId 'project1-sample' 
     version '1.1' 

     from components.java 
    } 
    } 
} 

가 지금은 ./gradlew publishToMavenLocal와 로컬 메이븐 저장소에 라이브러리를 푸시 할 수 있습니다.

테스트 프로젝트의 build.gradleapplication 플러그인을 사용하며 메인 클래스 (필자의 경우 Hello)를 정의합니다. 그런 다음 ./gradlew installDist을 실행하여 클래스 경로에 모든 종속성을 넣고 잘 실행되는 실행 파일 (Application plugin docs 참조)을 생성 할 수 있습니다.

group 'com.test' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 
apply plugin: 'application' 

repositories { 
    mavenLocal() 
    mavenCentral() 
} 

dependencies { 
    compile 'io.simplepush:project1-sample:1.1' 
} 

mainClassName = "Hello" 
+0

http://stackoverflow.com/help/someone-answers – LazerBanana

5

작성한 라이브러리 jar에는 IDE/Gradle이 테스트 프로젝트를 컴파일/실행할 수 있도록 해결할 수있는 종속성 정보가 없습니다. Maven 중앙 저장소를 사용하고있는 것을 볼 수 있으므로 라이브러리를 로컬 Maven 저장소에 게시하고 테스트 프로젝트에서는 종속성 정보 (단순한 jar 파일 제외)를 추가하면됩니다.

그래서 라이브러리 및 테스트 프로젝트에서 모두 build.gradle maven 로컬 저장소 구성을 추가하십시오.

repositories { 
    mavenLocal() 
    mavenCentral() 
} 

이제 로컬 보관소에 라이브러리를 게시해야합니다. gradles 3.3을 사용할 때 Maven Publishing을 사용할 수 있습니다.

도서관에 따라서 build.gradle 게시 정보를 추가하십시오.

publishing { 
    publications { 
     maven(MavenPublication) { 
      groupId 'io.simplepush' 
      artifactId 'project1-sample' 
      version '1.1' 

      from components.java 
     } 
    } 
} 

Gradle을 플러그인이 자동으로 PublishToMavenLocal 작업을 생성 로컬 저장소에 게시이 쉽게 "받는다는 게시". 그래서 그냥 실행할 수있는 지역 받는다는 저장소에 모든 종속성 정보와 라이브러리를 게시합니다

gradle publishToMavenLocal

.

는 그리고 당신은,이 때문에

repositories { 
    mavenCentral() 
} 

에서 종속성을 가져 확인 레포지토리을 지정하면 테스트 프로젝트 build.gradle

dependencies { 
     // other dependencies ..... 
     module 'io.simplepush:project1-sample:1.1' 
} 
+0

감사합니다. 이것은 내가하고 싶은 방향입니다. 'build.gradle' 파일의 첫 번째 레벨에서'compile'을 사용하여 종속성을 지정하고 java 플러그인을로드하여 전체 모델 섹션을 제거한 후 추가 수정을 수행하면 종속성을 올바르게 지정하는 로컬 maven 라이브러리가 생성 된 것으로 보입니다. 그 pom 파일. 그러나 나는 여전히 같은 오류가 발생합니다. 어쩌면 테스트 프로젝트에 대해 gradle로 실행 가능한 jar를 올바르게 생성하는 방법에 대해 자세히 설명해 주시겠습니까? – tymm

0

에 라이브러리 정보를 추가 할 수있는 아무것도 필요 dependecies{}은 위의 내용에서 가져옵니다.

테스트 프로젝트가 라이브러리 프로젝트와 결합되어 있지 않은 경우 (@RaGe 예제) 새 테스트 프로젝트는 종속성을 가져올 위치를 알고 있어야합니다 (기본 메소드를 사용하여 게시해야 함). 그 후

가 새 테스트 프로젝트가 IDE에 따라 당신이 클래스 경로를 새로 고쳐야 그 후 dependencies{}

build.gradle의 기본 구성 (컴파일 ... 런타임 등)와 라이브러리를 지정해야하고

build.gradle 지정된 저장소 전에 (이 경우) 라이브러리 의존성에 규정 된 이적 의존성이 테스트 프로젝트에서 가져온 얻을 것이다 repositories{}


라이브러리에서 종속성을 다운로드

repositories { 
    mavenCentral() 
} 

dependencies { 
    module 'commons-codec:commons-codec:1.10' 
    module 'org.apache.httpcomponents:httpcore:4.4.6' 
    module 'org.apache.httpcomponents:httpclient:4.5.3' 
} 

테스트 프로젝트 build.gradle

repositories { 
    mavenCentral() repository to fetch transitives 
    mavenLocal() or any other repo that you published the library to 
} 

dependencies { 
    pref-conf librarygroup:name:version 
} 

당신은 아이디어를 사용하거나 새로 추가 종속성을 새로 gradle idea 또는 gradle eclipseClasspath 작업 Gradle을에서 플러그인을 이클립스 수 있습니다.

이 솔루션을

, 당신은 도서관 내에서

PS를 전이 종속성을 포장 할 필요가 없습니다. 실행 가능한 병을 원한다고 말한 후에 나는 혼란스러워합니다.