2013-12-20 31 views
1

問題定義

我有一個基於Gradle的Spring MVC項目。我有一個網站項目(zeario-web),網絡爬蟲(zeario-webcrawler)和共享類(zeario-sharedclientserverclasses)。網絡和網絡爬蟲共享一些類(如DTO或VO)。在Eclipse中進行調試時,Spring無法從共享的Gradle庫(依賴於autowired bean)中找到類

在我的web應用程序,我有一個getWorkUnit方法CrawlerController;這要求在CrawlerService實例(@Autowired depdency),這反過來,使用某些類從共享庫的方法。

我的問題是我可以建立並通過搖籃部署我的web應用程序的工作版本,而不是通過Eclipse。 Eclipse給我一個關於找不到其中一個共享類的彈簧運行時異常,因此無法創建/注入服務實例。

從Tomcat日誌:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'crawlerController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.zeario.service.CrawlerService com.zeario.api.v1.controller.CrawlerController.service; nested exception is java.lang.NoClassDefFoundError: com/zeario/api/v1/model/workunit/PageDiscoveryWorkUnit

代碼段

控制器定義(簡化):

@Controller 
public class CrawlerController { 


    @Autowired 
    private CrawlerService service; 

    // ... methods with @RequestMapping ... 
} 

服務類(簡化):

@Service 
public class CrawlerService { 

    public PageDiscoveryWorkUnit getPageDiscoveryWorkUnit() { 
     return new PageDiscoveryWorkUnit(); 
    } 

PageDiscoveryWorkUnit是一個簡單的POJO/Bean類。我在spring-servlet.xml文件中聲明我的服務組件:

<bean id="crawlerService" class="com.zeario.service.CrawlerService" /> 

搖籃配置

1)根項目(空的,沒有源)定義settings.gradle子項目。依賴關係是在build.gradle

project(':zeario-web') { 
    dependencies { 
     compile project(':zeario-sharedclientserver') 
    } 
} 

project(':zeario-webcrawler') { 
    dependencies { 
     compile project(':zeario-sharedclientserver') 
    } 
} 

2)項目定義對其他項目的依賴關係,其中適用。例如,Web項目構建文件包含:

dependencies { 
    // Guava, Spring MVC, etc. ... 
    packed project(':zeario-sharedclientserver') // Shared code 
    // ... 
} 

Eclipse配置

當我檢查構建路徑,Eclipse中正確顯示項目的依賴;例如,它顯示web項目對shared client/server項目有依賴性。

+0

那麼你使用Eclipse本身來構建?或者通過* Eclipse而不是命令行運行Gradle * – Vidya

+0

@Vidya我正在使用Eclipse本身來構建。 Gradle構建基礎架構僅用於管理依賴關係,並支持構建JAR以部署到生產環境。 – ashes999

回答

0

非常感謝@Vidya幫助我認識到問題是Eclipse,而不是Gradle。問題在於Eclipse無法將文件複製到它所構建的JAR中。

步驟來解決這個問題:

  • 右鍵單擊Web項目,並挑選在Deployment AssemblyProperties
  • 並單擊Add
  • 選擇Project,並選擇共享庫
  • 清潔,重建和部署

Et中提琴,問題解決了!

注意:Eclipse有時會有一個大腦放屁,並且需要您刪除並重新添加項目依賴項。我也遇到了這個。

+0

祝賀您找到問題。我認爲社區規則要求對我的回答滿意,對你的回答也要接受(並且也贊同)。 – Vidya

2

它看起來像Eclipse是不是包裝包含PageDiscoveryWorkUnit捲入戰爭的罐子。這取決於你如何配置Eclipse。由拆包產生兩種方式的戰爭和比較`WEB-INF/lib中的內容進行確認。然後修改你的Eclipse配置以確保jar被添加。

+0

這是很好的見解,但並沒有真正幫助我。如果Eclipse已經將依賴項目視爲依賴項,那麼爲什麼它不會複製JAR或類文件。 – ashes999

相關問題