簡體   English   中英

Maven項目中的螞蟻罐庫

[英]Ant jar library in maven project

我們開始開發一個新的Web應用程序項目,並決定使用Maven。 該項目將使用一些較舊的基於內部ant的jar庫,因此我決定使用Nexus創建內部存儲庫。 我將庫部署到Nexus,並將pom.xml鏈接到新的存儲庫,並將依賴項設置為新創建的工件。 Maven可以毫無問題地進行戰爭,我可以將其部署在服務器上並啟動。 到目前為止,一切正常。

但是現在,當我嘗試調用該庫的某些代碼時,出現了NoClassDefFoundError異常。

java.lang.NoClassDefFoundError: HTTPClient/HTTPConnection
at com.logica.imfplus.authentication.client.HttpConnection.connect(HttpConnection.java:217)
at com.logica.imfplus.authentication.client.HttpConnection.<init>(HttpConnection.java:135)
at com.logica.imfplus.authentication.client.LoginController.getResponse(LoginController.java:402)
at com.logica.imfplus.authentication.client.LoginController.login(LoginController.java:169)
at com.logica.imfplus.authentication.client.AuthClientAPI.internalLogin(AuthClientAPI.java:416)
at ...
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

Caused by: java.lang.ClassNotFoundException: HTTPClient.HTTPConnection
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569)
... 38 more

我搜索了一下,然后手動將依賴項添加到缺少的庫中。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.3</version>
</dependency>

但是我還有另一個各種NoClassDefFoundError異常。 所有問題似乎更加復雜。

我想我理解問題所在:jar庫具有由ant定義的自己的內部依賴關系,但是它們對於maven不可見,因此仍然丟失。 但我不知道如何解決。

如果我是對的,我正在考慮手動檢查所有這些內部依賴項,並將它們添加到pom.xml中。 但這似乎是骯臟的解決方案,對此我感到不安全。 我也不想在我的pom.xml中添加混亂,如果不需要的話。 有沒有更清潔的方法,該怎么做? Maven可以檢查並解析由ant先前定義的非未修飾的jar庫的內部依賴性嗎?

我仍在學習Maven,因此解決方案可能很明顯。 我仍然沒有發現任何有用的東西。


編輯:找到解決方案並正常工作。 我根據建議創建了一個新的pom.xml,並定義了相關性,並(手動)將其上傳到了Nexus。 現在,傳遞性依賴關系已由maven正確解析並下載。 這是菲。 (實際上只有一個依賴項可以定義。)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.logica.imfplus.authentication</groupId>
    <artifactId>authenticationClient</artifactId>
    <packaging>jar</packaging>
    <version>1.3.1.0_8</version>
    <name>IMFplus authenticationClient</name>

    <dependencies>
        <dependency>
            <groupId>net.sf.grinder</groupId>
            <artifactId>grinder-httpclient</artifactId>
            <version>3.9.1</version>
        </dependency>
    </dependencies>
</project>

我仍然有一些ClassNotFoundException,但這可能是由庫中的某些沖突引起的,這是另外一回事了。

理想的方法是使用內部pom重建內部庫,並在其中指定所有依賴項。 然后,您應該將該pom.xml指向您的nexus存儲庫並進行部署(如在mvn deploy )。 這樣,pom.xml也將在關系中發布,並且任何使用maven依賴項的應用程序都將下載舊版庫所附帶的所有依賴項。

通常,您只應將內部構件部署到內部Nexus。 應該通過您的內部Nexus(作為公共Nexus信息庫的代理信息庫)獲取第三者工件。 如今,通常您可以在某個地方的公共存儲庫中找到大多數第三者工件。

當涉及到Maven時,它使用了所謂的傳遞依賴關系 ,簡而言之,這意味着如果工件A依賴工件B,並且您創建了一個依賴A的新工件,那么您還將依賴B。

為此,使用Maven構建工件A很重要,因為依賴關系是在構建時捕獲的。 另一種選擇是,您手動部署預構建的工件 ,在這種情況下,依賴項信息已丟失,您將必須通過為第三方工件創建pom來自己定義它。

假設依賴關系正確(可以使用mvndependency:list列出它們),當使用Maven構建WAR時,所有編譯和運行時依賴關系都將包含在WEB-INF / lib目錄中。

一個很好的解決方案是為ant項目創建一個pom.xml,以正確聲明依賴項,並使用ether ant任務將jar從Ant版本部署到Nexus實例。

然后,您可以像其他任何依賴項一樣使用Maven的Ant構建的Jar,它甚至將具有正確的可傳遞依賴項,並由automaticall.y管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM