16

我负责的 CI-server (Hudson) 构建 Maven 项目。最后一次提交后,构建失败:

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] \hudson\jobs\path to my class\MyClass.java:[33,62] package com.sun.xml.internal.messaging.saaj.packaging.mime.util does not exist
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,5] cannot find symbol
        symbol  : class BASE64EncoderStream
        location: class |fullname of MyClass|
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,38] cannot find symbol
        symbol  : class BASE64EncoderStream
        location: class |fullname of MyClass|
[INFO] 3 errors

所需的类 (com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream) 位于 rt.jar 中。

我尝试(按照http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies的说明)在项目的 pom.xml 中添加系统依赖项:

<dependency>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>1</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

它没有帮助。

最有趣的是所有文件都在我同事的本地机器上编译良好(他使用 Eclipse 内置编译器)。

在互联网上我发现了同样的问题(链接:http ://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-类-td107361.html )。最后一个答案是这个麻烦的原因是Oracle的Java编译器。

所以,我把Oracle的jdk改成了OpenJDK,但是没有用。

有人对如何解决这个问题有任何建议吗?

4

2 回答 2

16

需要指定-XDignore.symbol.file并添加 rt.jar 依赖项,<fork>true</fork>否则编译器插件将默默地删除任何 -XD 标志:例如

    ...
    <dependency>
        <groupId>groupid</groupId>
        <artifactId>artifiactId</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArgs>
                    <arg>-XDignore.symbol.file</arg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
            ...
于 2015-05-27T03:22:33.013 回答
9

缺少的类似乎是 JRE 内部的(如其命名空间中所示),不应从您的代码中引用。它可能仅在特定平台或 JRE 版本上可用。

考虑用另一个 Base64 编码器类替换它,例如来自Apache Commmons Codec 项目的一个。

Java 8 更新

Java 8 终于在 JDK 的公共部分引入了 Base64 类:java.util.Base64.

于 2012-10-29T12:54:17.033 回答