Java Maven:项目编译时没有在pom.xml中定义依赖项

Java Maven:项目编译时没有在pom.xml中定义依赖项,java,maven,Java,Maven,我有一个项目,我试着用两种不同的方式来构建: 将-Dmaven.repo.local设置为仅为构建创建的全新目录 没有-Dmaven.repo.local(那么我假设它默认为~/.m2 我觉得很奇怪,当我不使用-Dmaven.repo.local时,我的项目编译得很好,即使一些依赖项不在POM中。日志没有显示从本地repo下载或解析这些依赖项(~/.m2) 如果我试图构建一个全新的本地存储库,构建就会失败,因为javac无法解析某些类(这意味着Maven和Java不知道这些依赖关系在哪里)

我有一个项目,我试着用两种不同的方式来构建:

  • -Dmaven.repo.local
    设置为仅为构建创建的全新目录
  • 没有
    -Dmaven.repo.local
    (那么我假设它默认为
    ~/.m2
我觉得很奇怪,当我不使用
-Dmaven.repo.local
时,我的项目编译得很好,即使一些依赖项不在POM中。日志没有显示从本地repo下载或解析这些依赖项(
~/.m2

如果我试图构建一个全新的本地存储库,构建就会失败,因为javac无法解析某些类(这意味着Maven和Java不知道这些依赖关系在哪里)

正如您所看到的,构建无法找到
javax.ws.rs
,这是预期的,因为依赖项不在POM中。我不明白的是,当我抑制
-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>

4.0.0
com.mycompany.myproj.iaas
根
2.1.0
../com.mycompany.myproj.iaas
com.mycompany.myproj.iaas
休息
战争
myproj myproj-RestAPI.war
http://www.mycompany.com
org.powermock
powermock-module-junit4
1.6.1
测试
org.powermock
powermock api easymock
1.6.1
测试
org.easymock
轻松的
3.2
测试
com.mycompany.myproj.iaas
常见的
${project.parent.version}
com.mycompany.myproj.iaas
bpm
${project.parent.version}
com.mycompany.myproj.iaas
sql
${project.parent.version}
org.apache.wink
wink服务器
1.4
org.codehaus.jackson
杰克逊·贾克斯
1.7.4
org.codehaus.jackson
杰克逊xc
1.7.4
commons httpclient
commons httpclient
3.1
org.slf4j
slf4j api
${version.slf4j}
回写
回归经典
${version.logback}
org.slf4j
七月至六月
${version.slf4j}
log4j
log4j
1.2.16
org.jdom
Java文档对象模型
1.1
org.apache.wink
wink json提供程序
1.4
org.apache.wink
wink-json4j
1.4
javax.mail
邮件
1.4
假如
javax.servlet
javax.servlet-api
3.0.1
假如
net.commons
公共知识产权数学
1.21.1
朱尼特
朱尼特
4.11
测试
com.ibm.db2
db2jcc4
10.5
测试
com.ibm.db2
db2jcc许可证
10.5
测试
org.apache.maven.plugins
maven战争插件
假的
真的
${project.version}.${buildLabel}
org.apache.maven.plugins
maven surefire插件
方法
10
2.17
此组件构建myproj-RestAPI.war文件。

这是非常令人困惑的-如果POM中没有定义依赖项,它是如何解决的?

当Maven日志试图解决所有依赖项时,您肯定错过了它的一部分。 您的日志显示它是一个编译器错误,而不是Maven

事情总是这样:

  • Maven解析所有依赖项,包括可传递的依赖项(如果它们未被排除)
  • 对于那些Maven在本地repo中找不到并且无法从远程repo下载的依赖项,有一个警告(您错过了)。 此外,Maven可能在一段时间内不会再次尝试下载它们——这取决于远程回购设置)。Maven在本地回购协议中加入了一些“空诱饵”,以寻找缺失的依赖项
  • Maven仍将使用类路径中的所有可用JAR访问编译器 仅仅因为若jar被定义为依赖项,并不意味着它是必需的,代码可能会被编译
  • 最后,您从编译器中得到了错误,因为代码实际上使用了某些依赖项中的某些类 就这样

  • 顺便说一句:我不完全理解这个练习的目的

    不清楚,这些事物的可传递依赖关系是否在POM中声明?为什么不将日志粘贴到您的问题上?@Tunaki这些依赖关系没有在POM中声明。在问题描述中:)@thiagoh Done..good start@Phil现在你能添加pom.xml吗?我的目的不是理解为什么构建在其中一种情况下失败,而是为什么以及如何在另一种情况下工作良好。在其中一个场景中,构建完成得很好,即使依赖项不在POM中,也不是一个可传递的依赖项,并且日志从未显示它正在下载。如果在代码中使用REST,则失败的依赖项
    javax.ws.rs
    必须在树中。你只是错过了。它不在树上:)
    <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>