【问题标题】:Maven compilation fails while eclipse is successfuleclipse成功时Maven编译失败
【发布时间】:2011-09-27 15:50:56
【问题描述】:

我在 Windows XP 上使用 maven3.03 和 Eclipse 3.5。我将旧的 Web 项目转换为 Maven 配置样式。
当我在 Eclipse 中编译项目时,一切都会编译。
注意:类路径包含:Maven 依赖项和 JDK(1.6_018)。
当我使用 mvn 从命令行编译时,我得到了一些错误:
1.包com.sun.xml.internal.stream.buffer.stax不存在。
2. com.sun.xml.internal.stream.writers 包不存在
3.找不到符号 - 符号:类 XMLDOMWriterImpl
4.package com.sun.xml.internal.messaging.saaj.util 不存在
5.包com.sun.xml.internal.bind.v2.runtime.unmarshaller不存在
6.找不到符号 - 符号:类 NamespaceContexHelper
7.找不到符号符号:类ByteOutputStream

我可以看到这个有太阳罐的东西。但我就是不明白为什么eclipse可以而命令行不行。

编辑:我在上面的列表中没有提到的错误之一是:

[ERROR]<path>\EventsViewer.java:[54,69] inconvertible types found: <br>java.util.SortedMap<java.util.Date,java.util.List<com.myClass>>
required: java.util.Map<? extends java.util.Date,? extends java.util.List<com.myOtherClass>>


当我在 Eclipse 中看到同一行时,我收到警告:

Type safety: Unchecked cast from SortedMap<Date,List<myClass>> to Map<? extends Date,? extends 
 List<myOtherClass>>

在 Eclipse 中我得到警告,在 maven 中我得到错误。我确实检查了 org.eclipse.jdt.core.prefs 并看到设置是 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning。

更新: 我读到了上面的一些错误。 “问题”是在 Eclipse 中它显示为未使用的导入。 Stangly maven 将此报告为错误。删除此未使用的导入后,错误消失了。但是问题 3 和 7 仍然出现

结论:我猜这些警告在 javac 中变成了错误。因为我不使用任何 supressWarnings。我很惊讶错误是不同的。 这是什么?

【问题讨论】:

  • 很可能您的JAVA_HOME 没有在 Maven 环境中设置。
  • 您在哪些平台上运行 Maven 和 Eclipse?

标签: eclipse maven jar sun pom.xml


【解决方案1】:

这也许是真正的原因 from maven forum's answer

" Jerome 是对的,不建议使用 com.sun 来自 rt.jar 的类。尤其是那些标有“内部”的;你只是 自找麻烦。

但是我对此很好奇,所以尝试了一下。上面的类可以 确实可以被 Eclipse 访问。但是编译代码 使用 javac 的命令行因“不存在”错误而失败。所以我的 假设 Sun 的 java 编译器 检测到一个特殊的 正在访问“内部”类,并拒绝导入该类。 Eclipse 使用了一个不同的编译器,它可能没有这个检查。

Maven 只使用系统执行中可用的 javac 编译器 小路。因此,这个问题根本与 Maven 无关。这是 maven 正在调用的编译器拒绝编译源代码。 我在 javac 命令行中看不到任何公共标志来禁用它 “阻止”内部访问,所以除非你想避免使用 Sun 的 javac 编译器你只需要避免使用这个内部类。

只是为了好玩,我尝试了 Jerome 将 rt.jar 放在 类路径: javac -cp /usr/java/jdk1.6.0_03/jre/lib/rt.jar Foo.java 但这仍然无法编译。

ByteOutputStream 类可以在运行时通过 Class.forName("..")。

有趣的是,我正在做的一个项目确实会导入类 com.sun.org.apache.xml.internal.utils.SAXSourceLocator; 这工作正常。发出警告,但代码编译(是的, 它在我的 TODO 列表中来解决这个问题:-)。所以它不是 all 内部类 被阻止的,只是选定的。 "

【讨论】:

    【解决方案2】:

    仔细检查您对 Eclipse 和 Maven 构建使用相同的 JDK。即使您认为自己是,请再次仔细检查。

    这些包是某些 Java 版本中包含的一些包,而其他版本则不包含这些包。

    【讨论】:

    • +1 如果 java 版本不同,添加 maven-compiler-plugin 配置源和目标指向 1.6 并从 Maven 项目上下文菜单更新项目配置将在许多情况下解决问题
    • 明确地说,我说的是使用 Java 的实际目录,而不是 Java 5 vs Java 6
    • 好的,我将其添加为单独的答案,以免混淆某人
    • Jeanne,我不明白 - 您在“包含在某些 Java 版本中而不是其他版本中”和“实际目录”中是什么意思?
    • IBM 喜欢在他们的 JDK 中包含不应该/不应该在运行时中的东西。这意味着如果您使用 IBM JDK 编译,一切似乎都很好,而当您使用另一个 JDK 编译时,类会丢失。
    【解决方案3】:

    如果 java 版本不同,添加 maven-compiler-plugin

    <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.1</version>
                    <configuration>
                        <target>1.6</target>
                        <source>1.6</source>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    源和目标的配置指向 1.6 和 从 Maven 项目上下文菜单中更新项目配置将解决很多情况下的不同步问题(导致编译结果不同):

    【讨论】:

    • 谢谢。我尝试了你写的maven-compiler-plugin,但没有帮助。我没有尝试您的第二个建议(“更新项目配置”)(它有时会以一种奇怪的方式更改我的 .classpath),但我会再试一次并让您知道。再次感谢。
    • 没用。奇怪的是,它使用 J2SE_1.6 而不是使用 JDK1.6_018 的 eclipse 更改了 .classpath 文件。
    【解决方案4】:

    这是我的情况:我在添加//TODO 后在 IntelliJ 中遇到了同样的错误,Intellij 在导入部分自动添加了这一行 import com.sun.xml.internal.bind.v2.TODO;

    删除上面的导入行后,问题解决了。现在我可以使用 maven 成功编译了

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多