2016-05-04 33 views
1

快速背景:
我已成立了一個Java服務提供者接口,允許用戶創建自己的自定義插件。他們實現的接口是獨立的包,所以我可以發佈一個更小的包到他們沒有其他龐大的代碼。Maven的依賴和Java服務提供者接口

一旦用戶創建自己的JAR,他們可以動態地將其運行過程中使用一些黑客反射加載到應用程序(即我發現這裏的SO)。這些似乎運作良好,但一旦我轉移到另一個開發人員機器(和我們的Jenkins盒子),依賴關係開始以某種方式拋出。

用於接口的JAR是兩個主應用程序,並且較小的用戶創建的插件的依賴關係。當用戶上傳JAR時,他們一直在使用包含該依賴關係的JAR,這有助於確保界面相同。這使得Java SPI能夠將其提取出來並使其可用。我已經開始切換用戶的軟件包使用的依賴關係爲<scope>provided</scope>,希望這能解決org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.util.ServiceConfigurationError: com.company.interface.MyInterface: Provider com.usercode.ClassName not a subtype

當使用提供範圍我試圖在用戶罐加載時碰上的java.lang.NoClassDefFoundError: com/company/interface/MyInterface不同的錯誤。

任何人都知道我可以用這個界面JAR和Maven做些什麼來使這些遊戲更加美好?

回答

0

如果插件使用此jar的provided範圍,那麼您需要確保運行這些插件的主應用程序實際上在插件可以訪問的類路徑上提供該jar。

而且這個錯誤:java.lang.NoClassDefFoundError是不是根本原因。 您應該在應用程序日誌中找到該錯誤的第一個實例,該實例應顯示該錯誤的根本原因。如果班級路徑中缺少班級,它將是java.lang.ClassNotFoundException

+0

重建和檢查後,我看到一個'java.lang.ClassNotFoundException'。我將「父」應用程序部署爲WAR,其WEB-INF/lib確實具有所需的JAR。我沒有在父應用程序中將依賴項標記爲提供的範圍。子應用程序,提供,父應用程序,不提供(希望它增加到類路徑,但它不是)。 – Walls