2017-08-10 142 views
0

我希望標題本身是描述性的,但要清楚,我想包括一個jar(即錯誤處理 - service.jar中)在問候服務。罐子。構建之後我列入新的項目(即TestApplication),但在執行TestApplication我收到的問候,service.jar中(順便說一句,TestApplication不是gradle這個項目)搖籃:添加類的JAR文件的類路徑

Exception in thread "main" java.lang.NoClassDefFoundError: co/common/exception/BaseException 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 

co.common.exception。 BaseException是一個類錯誤處理服務模塊

按照question在這裏。我包括

manifest { 
      attributes(
        "Manifest-Version": "1.0", 
        "Class-Path": configurations.compile.collect { it.getName() }.join(' ') 
      ) 
     } 

這裏是問候服務的的build.gradle這是依賴於錯誤處理服務

buildscript { 
    repositories { 
     mavenCentral() 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'idea' 
apply plugin: 'maven' 

repositories { 
    mavenCentral() 
    mavenLocal() 
} 

dependencies { 
    compile('org.apache.commons:commons-lang3:3.0') 
    compile('org.apache.commons:commons-collections4:4.0') 
    compile('org.slf4j:slf4j-api:1.7.25') 
    compile('co.common:error-handling-service:1.0.0-SNAPSHOT') 
    testCompile("org.mockito:mockito-all:1.9.5") 
    testCompile('junit:junit:4.12') 
} 

jar { 
    baseName = 'greeting-service' 
    version = '1.0.0-SNAPSHOT' 
    manifest { 
     attributes(
       "Manifest-Version": "1.0", 
       "Class-Path": configurations.compile.collect { it.getName() }.join(' ') 
     ) 
    } 
} 

group = 'co.common' 
version = '1.0.0-SNAPSHOT' 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 


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

問候服務的成功構建後,我包括在TestApplication問候,service.jar中而且我仍然收到了上述相同的例外。

Manifest-Version: 1.0 
Class-Path: commons-lang3-3.0.jar commons-io-2.4.jar commons-collections 
4-4.0.jar slf4j-api-1.7.25.jar error-handling-service-1.0.0-SNAPSHOT. 
jar commons-logging-1.1.3.jar 

爲什麼會發生這種情況,應該怎麼辦?

回答

0

Java中的NoClassDefFoundError是在Java虛擬機無法在運行時找到特定類並且在編譯時可用的情況下發生的。例如,如果我們有一個來自某個類的方法調用或訪問某個Class的靜態成員,並且該類在運行時不可用,那麼JVM將拋出NoClassDefFoundError。

因此,假設您的gradle構建過程成功 - 我可能會得出結論,您提供的錯誤error-handling-service-1.0.0-SNAPSHOT.jar,它不包含co/common/exception/BaseException類。

你應該仔細檢查這個罐子的實際內容。

+0

jar的內容不包含error-handling-service-1.0.0-SNAPSHOT.jar的類。但是,這是我想知道我的配置看起來不錯,或者我失去了一些東西? –

+0

你的構建文件看起來不錯。但是錯誤是由於缺少類co/common/exception/BaseException造成的。因此,您應該將包含此類的.jar文件包含到構建路徑中。或者你可以從你的代碼中刪除這個類的用法。您可以使用'gradle dependencies'命令檢查您的gradle項目的實際依賴關係 –

0

不知道這是否會有所幫助,但是,如果您的error-handling-service.jar已經打包並準備好作爲dependency包含到greeting-service.jar中,那麼您應該將其作爲依賴關係。

例如:

  1. 在你的項目中,創建一個名爲「LIB」文件夾
  2. 添加您的錯誤處理,service.jar中的「LIB」文件夾
  3. 添加以下你的依賴塊:

    依賴{ 編譯文件樹(導演: 'LIB',包括:[ '的* .jar']) ... }

基本上,當您運行構建時,放入「lib」文件夾的每個* .jar將被添加到您的應用程序jar中。

+0

我想避免greeting-service.jar的用戶再次包含greeting-service的依賴關係。我的jar將會是即插即用的。 –