webservice请求数据时类com/sun/tools/internal/xjc/api/XJC找不到的原因探究

一.缘由

最近做的一个项目中,有需要请求webservice数据的地方,

JaxWsDynamicClientFactory dcf = null;
                     dcf = JaxWsDynamicClientFactory.newInstance();

        Client client = dcf.createClient("地址");

然后client再调用invoke方法,起初在eclipse中测试的时候,没有出现任何问题,但是将包部署到服务器的时候,出现client调用invoke方法的时候,出现了一段异常:

 - with linked exception:
[java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC]
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:713)
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:720)
	... 43 more
Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:706)
	... 44 more

二.分析

  在网上查了一些资料,众说纷纭,很多人说就是缺少一个依赖,说这个依赖在tools.jar里里面,直接把这个包引进去就好,用反编译工具查看了一下这个jar包的结构,这个类确实在这里面,于是我把这个包引入这个项目里面,运行,还是报同样的错,说明这个方法不行。当然网上也有一些说缺其他jar包的,当然也都不可以。这不是一个普通的jar包,这样引入,项目无法依赖到。

进一步分析,同样的代码,在eclipse中运行正常,在linux服务器里面出现这样的异常,说明不是项目本身的问题,一定是java环境的问题。想了一下,自己所用的服务器的jdk是centOS系统在安装的时候自带的,可能会和自己手动安装的有些差异,应该从这个地方入手。

三.解决方案

CentOS7.0虽然自带JDK1.7和1.8,运行“java -version”命令也可以看到版本信息,但是jdk的安装环境不全,比如缺少tool.jar和dt.jar等,这就导致“javac”等这样的命令即便配置了环境变量也不能用,所以要重新安装jdk,并且配置环境变量,并解决“javac”命令不可用的问题。

下载安装JDK(必须在连接外网的情况下进行,我也是找了负责机房的老师进入机房解决的,还要专门插外网的网线)

    1.CentOS下,首先让当前用户获取root权限,打开终端输入命令:

      su root

    2.查看可安装的JDK版本:

      yum search java-1.7
                在查询结果列表如下:

      java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
      java-1.7.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
      java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
      java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
      java-1.7.0-openjdk-headless.x86_64 : The OpenJDK runtime environment without audio and video support
      java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
      java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle

    3.安装这一款,命令:

      yum -y install java-1.7.0-openjdk-devel.x86_64

      安装完成提示:

    已安装:java-1.7.0-openjdk-devel.x86_64 1:1.7.0.141-2.6.10.1.el7_3

      作为依赖被升级:
     java-1.7.0-openjdk.x86_64 1:1.7.0.141-2.6.10.1.el7_3 java-1.7.0-openjdk-headless.x86_64 1:1.7.0.141-2.6.10.1.el7_3 nspr.x86_64 0:4.13.1-1.0.el7_3      nss.x86_64 0:3.28.4-1.2.el7_3
     nss-sysinit.x86_64 0:3.28.4-1.2.el7_3 nss-tools.x86_64 0:3.28.4-1.2.el7_3 nss-util.x86_64 0:3.28.4-1.0.el7_3

    完毕!

    记住上面“已安装”后面的文件夹名称,不要搞混了。我们用此文件所在的路径作为JAVA_HOME。切记!

    4.安装结束后,浏览下安装后的目录:

      JDK安装在/usr/lib/jvm/文件夹下。在这个文件夹下有多个JDK版本,通过已安装成功的提示信息里面的JDK版本,找到我们刚安装的版本文件夹。

      如:我这里找到新安装的JDK文件夹是:/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64

        cd /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64/lib

        ls
      查询结果:

        amd64 ct.sym dt.jar ir.idl jconsole.jar jexec orb.idl sa-jdi.jar tools.jar

      终于见到了久违的tool.jar 和dt.jar包。因为centOS 7.0自带的JDK压根就没有这些jar包,所以不管你环境变量配置正确与否,“javac”命令也不能用,因为               这个命令依赖tool.jar这个jar包。

    5.接下来配置环境变量:

      ①获取JDK的安装路径:

      第四步中,我们所在的文件夹是/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64/lib中。

      输入下面两条命令(注意cd后有空格),获取到的就是JDK的安装目录:

      cd .

      pwd
      /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
      这个路径,即:JAVA_HOME

      ②使用命令编辑环境变量文件:

      vim /etc/profile
      Vim开文件后,键盘按“E”,进入编辑模式,然后按几下键“pagedown”,来到文件底部。

      ③将下面的JAVA_HOME修改为刚获取的JAVA_HOME路径,然后拷贝到文件底部。

        export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
        export PATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
          解释:
        - 只需要改第一行“export JAVA_HOME=”后的部分为你的JDK路径,注意末尾不要加“/”。其他都无需更改。
        - exprot命令用于将shell变量输出为环境变量
        - “:”冒号,linux中用于分割路径,Windows中用“;” 分割。,在此分割JAVA_HOME和其他环境变量($PATH)
        - CLASSPATH中的 “.” 不能丢失。CLASSPATH指引到tools.jar,才可以在任意目录下用“javac”命令

      ④输入完成后,按键“ESC”切换到Vim的命令模式,输入命令(冒号,按住“SHIFT+:”即可),保存退出

        :wq!
    6.使环境变量立即生效命令:

      source /etc/profile
    7.检查环境变量是否配置成功:

      在任意的文件路径下,终端输入命令:

      javac
      显示结果如下,环境变量配置成功:

      [[email protected] java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64]# javac
        用法: javac <options> <source files>
        其中, 可能的选项包括:
        -g 生成所有调试信息
        -g:none 不生成任何调试信息
        -g:{lines,vars,source} 只生成某些调试信息
        -nowarn 不生成任何警告
        -verbose 输出有关编译器正在执行的操作的消息
        -deprecation 输出使用已过时的 API 的源位置
        -classpath <路径> 指定查找用户类文件和注释处理程序的位置
        -cp <路径> 指定查找用户类文件和注释处理程序的位置
        -sourcepath <路径> 指定查找输入源文件的位置
        -bootclasspath <路径> 覆盖引导类文件的位置
        -extdirs <目录> 覆盖所安装扩展的位置
        -endorseddirs <目录> 覆盖签名的标准路径的位置
        -proc:{none,only} 控制是否执行注释处理和/或编译。
        -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
        -processorpath <路径> 指定查找注释处理程序的位置
        -d <目录> 指定放置生成的类文件的位置
        -s <目录> 指定放置生成的源文件的位置
        -implicit:{none,class} 指定是否为隐式引用文件生成类文件
        -encoding <编码> 指定源文件使用的字符编码
        -source <发行版> 提供与指定发行版的源兼容性
        -target <发行版> 生成特定 VM 版本的类文件
        -version 版本信息
        -help 输出标准选项的提要
        -A关键字[=值] 传递给注释处理程序的选项
        -X 输出非标准选项的提要
        -J<标记> 直接将 <标记> 传递给运行时系统
        -Werror 出现警告时终止编译
        @<文件名> 从文件读取选项和文件名
      

    8.当出现以上内容时,说明jdk已经被正常配置。重新启动项目,发现之前的问题就不复存在了。

四.总结

  在使用系统自带的软件时,要多加注意这样安装和手动安装的差异。

       

原文地址:https://www.cnblogs.com/EthanShao/p/11318047.html

时间: 2024-08-30 04:30:02

webservice请求数据时类com/sun/tools/internal/xjc/api/XJC找不到的原因探究的相关文章

javac找不到或无法加载主类 com.sun.tools.javac.Main,

javac找不到或无法加载主类 com.sun.tools.javac.Main ecplise在配置jdk时,1(要选择jdk的那层目录D:\JDK\jdk_64\jdk,不要选择jre的那层),2(这个错误有有可能是环境变量的问题,还有可能是你的工程中确实没有tools这个包)我原因就是工程没有这个包,因为这个包是jdk自带的包,所以我就认为这个包不需要手动添加.最后测试,这个包是要手动添加到工程中的. 去掉不用的工作空间 1.去掉不用的工作空间Eclipse中,有些workspace不再使

C#.NET验证码智能识别学习笔记---06 解决java jre问题:JTessBoxEditor.jar打开的时报找不到或无法加载主类 com.sun.tools.javac.Main错误

技术qq交流群:JavaDream:251572072 教程下载,在线交流:it.yunsit.cn 碰到了这个问题在网上搜了下, 问题描述:我的问题是在使用javac编译测试程序市,出现如下错误: 错误: 找不到或无法加载主类 com.sun.tools.javac.Main 解决办法:当出现这个错误时,百度之,结果很多人都是说的环境变量设置错误,但是检查了下环境变量,没有什么问题. 这时,看到错误信息中有javac,猜想大概是找不到javac这个文件吧,于是到jdk\bin目录下,发现没有j

XML校验之sun.tools.internal.xjc.Driver

最近在用XML做数据对接,用到了XSD文件来对XML进行校验.XSD就是一个规范,对应于这个规范还需要有java代码来对XML处理.可以用sun.tools.internal.xjc.Driver这个类来生成java代码.可以用批处理文件来实现.但是用jdk1.6.0_04会报错,然后换了个版本的jdk就可以了.至今也不知道为什么.(两者的sun.tools.internal.xjc下面都有Drever这个类,有可能是classpath环境变量没有配置好的缘故) 报错信息D:\implement

安装java后,运行时提示找不到或无法加载主类 com.sun.tools.javac.Main

这个在我们班有不少同学遇到,想到初学者这种问题可能不在少数,我这里就对这个问题说一下原因与解决方法吧. 原因很简单: 首先,JDK是开发环境  JRE是运行环境 JDK安装包中包含JRE. 安装JDK的时候会提示两次安装目录,第一次是JDK安装目录,第二次是JRE的安装目录.遇到这种问题的朋友是把JDK与JRE安装在了同一目录下导致的. 解决办法: JKD安装时将两次目录选择放在不同的目录就可以了,比我的JDK安装目录是D:/JAVA/JDK    JRE安装目录是D:/JAVA/JRE 这样问

错误;找不到或无法加载主类 com.sun.tools.javac.main的解决方案

我是先安装了java1.8然后老师说教学用的是java1.7,所以我又装了1.7,结果悲剧了,设置好环境变量,cmd敲入javac时就报标题所示的错误,捣鼓好一会终于解决. 解决方法:再其他错误排除的情况下 如:配置问题都解决了  也能在cmd下  java  -version 能现实正确的版本信息的情况下,执行测试例子出错就是缺少一个.jar文件, 在你java安装目录下lib文件里,没有tools.jar文件,找一个相同版本的附加上去就可以了! 后来又探究了下如何为什么java安装目录lib

jQuery的Ajax请求数据时type无法使用GET

写一个ASP.NET MVC例子,它是使用jQuery的$.Ajax来呼叫控制器的数据. 创建一个视图: 运行结果: 一切正常,但是本例子我们只是获取数据,并没有做任何数据POST上传至控制器,我们尝试把jQuery代码的type改为GET试. 再次浏览,但结果没有达到我们预期的效果,没有数据显示. 奇怪,经查资料,原来JsonResult操作返回JSON时,JsonRequestBehavior默认是POST.因此我们需要为其指定参数选项JsonRequestBehavior.AllowGet

HTTP客户端之使用request方法向其他网站请求数据

在node中,可以很轻松的向任何网站发送请求并读取该网站的响应数据. var req=http.request(options,callback); options是一个字符串或者是对象.如果是字符串,将自动使用url模块中的parse方法转换为一个对象.options中可以指定以下属性. host:用于指定域名或目标主机的IP地址,默认属性值为"localhost". hostname:用于指定域名或目标主机的IP地址,默认属性为"localhost".如果hos

nodejs向前台send数据时Date类型数据格式问题

1.现象 前端向nodejs服务器请求数据时,发现得到的返回数据中日期字段(json格式)值不熟,处理时发现有时差 从mysql中读出的时间格式 > publishtime:Sat Aug 19 2017 15:46:01 GMT+0800 (中国标准时间) 前端收到的时间格式 > "publishtime":"2017-07-16T14:46:01.000Z" "Sat Aug 19 2017 15:46:01 GMT+0800"这

request获取请求头和请求数据

1 package cn.itcast.request; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.PrintWriter; 6 import java.lang.reflect.InvocationTargetException; 7 import java.util.Enumeration; 8 import java.util.Map; 9 10 import javax.s