当 maven 项目中用到 webservice 时,有用到 JDK 内部的一些接口,如下所示。
import com.sun.xml.internal.ws.client.BindingProviderProperties;
import com.sun.xml.internal.ws.developer.JAXWSProperties;
用 maven 编译一般会出现如下错误:
[ERROR] COMPILATION ERROR :
[ERROR] com.sun.xml.internal.ws.client.BindingProviderProperties
[ERROR] com.sun.xml.internal.ws.developer.JAXWSProperties
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project test: Compilation failure: Compilation failure:
[ERROR] 程序包com.sun.xml.internal.ws.client.BindingProviderProperties不存在
[ERROR] 程序包com.sun.xml.internal.ws.developer.JAXWSProperties不存在
[ERROR] -> [Help 1]
经查看发现,以上缺失的包为 JDK 中的 rt.jar 中的接口。
解决方法是,在 pom.xml 文件,添加 maven-compiler-plugin 插件,并且配置compilerArguments,将 rt.jar 路径配置到 bootclasspath,具体实现时有多种方法。
1. 方法一:pom 文件自定义 JDK 路径。
pom.xml 文件配置 java.home 属性值,指向开发者本机 JDK 路径,然后再将 /jre/lib/ 路径下的 rt.jar 配置到 bootclasspath,具体实现如下所示。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${java.home}/jre/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
这里的 rt.jar 需要配置正确的路径,pom.xml 文件添加如下关于 java.home 的配置,配置成开发环境的 JDK 路径即可。
<properties>
<java.home>C:\Program Files\Java\jdk1.8.0_101</java.home>
</properties>
这样的不便之处是,团队中的每个开发者本机 JDK 环境地址不同,编译时需额外修改地址。
2. 方法二:继承 maven 配置的 java home 环境变量。
命令行 mvn -v 查看本机 maven 配置,如下所示。
$ mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800)
Maven home: G:\Program Files (x86)\apache-maven-3.0.5-bin\apache-maven-3.0.5
Java version: 1.8.0_101, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_101\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"
由此可见,java.home 配置信息是:C:\Program Files\Java\jdk1.8.0_101\jre,此时需要将 bootclasspath 修改为如下配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
此时无需在 pom.xml 文件中额外配置 java.home 属性。
3. 方法三:使用系统 JAVA_HOME 环境变量指向的路径。
所有环境变量都可以使用以 env. 开头的 Maven 属性引用。例如 ${env.JAVA_HOME}指代了 JAVA_HOME 环境变量的值。也可以通过命令行 mvn help:system 查看所有环境变量。
经查看,本机 JAVA_HOME=C:/Program Files/Java/jdk1.8.0_101,pom.xml 文件可做如下配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${env.JAVA_HOME}/jre/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
任选一种方法配置好之后,再编译打包,即可编译成功。