mvn 安装因“类型不兼容”而失败

问题描述 投票:0回答:3

我从“mvn clean install”中收到以下错误

[ERROR]    /private/tmp/framework/src/main/java/org/jboss/narayana/txframework/api/annotation/transaction/WSBA.java:[21,65] incompatible types
found   : org.jboss.narayana.txframework.api.configuration.transaction.CompletionType
required: org.jboss.narayana.txframework.api.configuration.transaction.CompletionType
[ERROR] /private/tmp/framework/src/main/java/org/jboss/narayana/txframework/api/annotation/service/ServiceRequest.java:[32,56] incompatible types
found   : org.jboss.narayana.txframework.api.configuration.service.RequestType
required: org.jboss.narayana.txframework.api.configuration.service.RequestType
[INFO] 2 errors

我假设这是一个依赖问题,并且构建路径中的某个地方还有另一个 CompletionType 实例。我已经检查过情况并非如此,并且还尝试使用空的 ~/.m2/repository。

我尝试重命名有问题的包的包,但这并不能解决问题。我只是在两行中使用新的包名称时遇到相同的错误。

我在 pom.xml 中的依赖项不应包含包含这些类的库。

我尝试在另一位开发人员的计算机上重现此问题,但没有出现问题。

我在两台计算机上看到此问题。这些计算机的很多环境都已同步,因此问题也已同步,我对此并不感到惊讶。然而,在我的办公室计算机上,我可以在 Intellij 中成功执行“mvn install”,但不能在命令行上执行。在我的家用计算机上,我在命令行和 IntelliJ 中都遇到了这个问题。

我已经尝试用 Google 搜索这个问题,但是一旦我从构建中删除了特定于我的项目的文本,我就没有足够具体的内容可供搜索。

pom.xml 可以在这里找到:

http://anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/txframework/framework/pom.xml

是的,我知道这是一个 JBoss 软件包,其中出现了问题。我为 JBoss 工作,这是我的代码,所以我无法让他们修复它;-)

谢谢。

maven maven-3
3个回答
3
投票

这是由于该版本的Oracle JDK中编译器的注释处理中的一个bug导致的:

java version "1.6.0_27"
Java(TM) SE Runtime Environment (build 1.6.0_27-b07)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode)

它也出现在等效的 mac 版本中,在发布时是最新版本。

我通过切换到此版本的 OpenJDK 解决了该问题:

java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.4) (fedora-60.1.10.4.fc15-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

如果您无法切换 JDK(例如,如果您有 Mac),可以采取解决方法。

更多详细信息可以在我用来跟踪此问题的错误报告中找到:

https://issues.jboss.org/browse/JBTM-997


2
投票

编辑:我重组了这个答案,因为它的主要目的是提供一个解决方案来发现问题而不是解决问题。这些元素按照我在评论或此处发布的顺序添加。

  1. 不是一个常规的依赖问题,因为如果你更改类的名称,这个问题就会消失。

  2. 可能与java版本有关。尝试明确设置源和目标。

  3. 这可能是您的依赖结构中错误的 jar,请尝试以下操作: 将其添加到您的 pom 中:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}
                </outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <configuration>
                        <version>4.0.0</version>
                    </configuration>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

调用全新安装,然后在 shell 上尝试此命令(在项目的基本路径中,而不是 dist 目录中。):

find . -name "*jar" -exec jar -tvf {} \; |grep RequestType

通过这种方式,您可以看到类路径上有多少个 RequestType 表示形式,也许您会看到错误的表示形式来自何处。

  1. 您的类现在可能存在正确的版本,但是引发问题的类(ServiceRequest.java)针对错误的版本进行编译。将它们放在同一个类路径中,然后重试。

  2. 您的磁盘上是否有该课程的旧版本?尝试将其删除(如果您仍然需要,可以将其移动到便携式设备上)。

  3. 手动删除类路径中的每个二进制文件。不要依赖“mvn clean”来工作。

  4. 打印出maven正在使用的类路径(谷歌会告诉你如何做)。检查是否有任何您未预料到的内容。

  5. (晦涩)通过使用 UTF 的更晦涩的功能,可以两次创建完全相同的目录。如果你的路径包含非 ASCII 字符并且你的一台机器是 Mac(真的,不是开玩笑。对于德语能力者:http://www.danisch.de/blog/2011/11/18/wer- unicode-und-utf-erfunden-hat-gehort-erschlagen/)。

  6. 您检查过环境变量设置是否正确吗?仔细检查它们。

  7. 致电:

    mvn 干净 mvn编译

然后查看您有多少个违规类的实例。


0
投票

清洁工作区也有效。 :)

© www.soinside.com 2019 - 2024. All rights reserved.