簡體   English   中英

Maven:項目編譯時沒有在pom.xml中定義的依賴項

[英]Maven: project compiles without dependency defined in pom.xml

我有一個嘗試以兩種不同方式構建的項目:

  • -Dmaven.repo.local設置為僅為構建創建的全新目錄。
  • 沒有-Dmaven.repo.local (那么我假設它默認為~/.m2

我發現很奇怪,即使某些依賴項不在POM中 ,當我不使用-Dmaven.repo.local時,我的項目也可以正常編譯。 日志未顯示從本地存儲庫( ~/.m2 )下載或解析的這些依賴項。

如果我嘗試構建一個全新的本地存儲庫,則構建將失敗,因為javac無法解析某些類(這意味着Maven和Java不知道這些依賴關系在哪里)。

[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/MigrationUninstallModulesResource.java:[18,23] error: package javax.ws.rs.core does not exist
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/MigrationUninstallModulesResource.java:[42,1] error: cannot find symbol
[ERROR] symbol: class Path
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/assets/MigrationUninstallModulesAsset.java:[16,18] error: package javax.ws.rs does not exist
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/assets/MigrationUninstallModulesAsset.java:[17,23] error: package javax.ws.rs.core does not exist
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/assets/MigrationUninstallModulesAsset.java:[19,41] error: package org.apache.wink.common.annotations does not exist
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/assets/MigrationUninstallModulesAsset.java:[23,1] error: cannot find symbol
[ERROR] symbol: class Asset
[ERROR] /home/jenkins1/slave_home/workspace/Build/2.x/Dev_Test/2-Mainline_Stream_official_Green_build_V2/workspace/com.mycompany.myproj.iaas.rest/src/main/java/com/mycompany/myproj/iaas/api/rest/assets/TeamAsset.java:[12,18] error: package javax.ws.rs does not exist
[ERROR] -> [Help 1]

如您所見,由於依賴項javax.ws.rs POM中,因此構建無法找到javax.ws.rs 我不明白的是為什么當我抑制-Dmaven.local.repo時構建成功。

POM:

<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>

    <parent>
        <groupId>com.mycompany.myproj.iaas</groupId>
        <artifactId>root</artifactId>
        <version>2.1.0</version>
        <relativePath>../com.mycompany.myproj.iaas</relativePath>
    </parent>

    <groupId>com.mycompany.myproj.iaas</groupId>
    <artifactId>rest</artifactId>
    <packaging>war</packaging>
    <name>myproj myproj-RestAPI.war</name>
    <url>http://www.mycompany.com</url>

    <dependencies>
       <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.6.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.6.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>3.2</version>
        <scope>test</scope>
    </dependency>
        <dependency>
            <groupId>com.mycompany.myproj.iaas</groupId>
            <artifactId>common</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mycompany.myproj.iaas</groupId>
            <artifactId>bpm</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mycompany.myproj.iaas</groupId>
            <artifactId>sql</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.wink</groupId>
            <artifactId>wink-server</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-jaxrs</artifactId>
            <version>1.7.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-xc</artifactId>
            <version>1.7.4</version>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${version.slf4j}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${version.logback}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>${version.slf4j}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.wink</groupId>
            <artifactId>wink-json-provider</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.wink</groupId>
            <artifactId>wink-json4j</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>net.ripe.commons</groupId>
            <artifactId>commons-ip-math</artifactId>
            <version>1.21.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
           <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.ibm.db2</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>10.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.ibm.db2</groupId>
            <artifactId>db2jcc_license_cu</artifactId>
            <version>10.5</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                        <manifestEntries>
                            <Implementation-Version>${project.version}.${buildLabel}</Implementation-Version>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <parallel>methods</parallel>
                    <threadCount>10</threadCount>
                </configuration>
                <version>2.17</version>
            </plugin>
        </plugins>
    </build>

    <description>This component builds the myproj-RestAPI.war file.</description>
</project>

這非常令人困惑-如果未在POM中定義依賴關系,如何解決?

當Maven日志嘗試解析所有依賴項時,您肯定會錯過它的一部分。 您的日志顯示這是一個編譯器錯誤而不是Maven。

總是這樣:

  1. Maven解決所有依賴項,包括傳遞性依賴項(如果不排除它們)
  2. 對於那些依賴關系,Maven無法在本地存儲庫中找到,也無法從遠程存儲庫下載文件,因此會發出警告。 (你錯過了)。 而且,Maven可能在一段時間內不會嘗試再次下載它們-這取決於遠程回購設置。 Maven將一些“空誘餌”放入本地存儲庫中,以丟失依賴項。
  3. Maven仍將使用Classpath中所有可用的jar進行編譯,這僅僅是因為將jar定義為依賴項並不意味着需要它,並且代碼可以編譯。
  4. 最終,您從Compiler獲得了Errors,因為代碼實際上使用了某些依賴項中的某些類。

順便說一句:我不完全了解該練習的目的...

暫無
暫無

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

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