为什么我的Java 6 JDK中的这个类看起来像Java 5版本?

时间:2014-09-29 13:20:24

标签: java maven intellij-idea intellij-13

我正在使用Java 6运行IntelliJ来构建我的项目。我正在通过SVN进行干净的结账并尝试执行mvn clean install它运行成功但是当我尝试部署我的应用程序时,我得到编译时错误。它说我试图使用一个不存在的构造函数。

具体来说,我试图使用Here中的构造函数。此构造函数不在Java 5版本中。但由于某种原因,我的jdk 1.6安装中的.class文件似乎是Java 5版本。 .class文件的位置为/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar!/javax/xml/ws/Service.class,当我向下钻取时,该路径直接从IntelliJ复制。

以下是IntelliJ

的反编译代码
  // IntelliJ API Decompiler stub source generated from a class file
  // Implementation of methods is not available

package javax.xml.ws;

public class Service {
    private javax.xml.ws.spi.ServiceDelegate delegate;

    protected Service(java.net.URL url, javax.xml.namespace.QName qName) { /* compiled code */ }

    public <T> T getPort(javax.xml.namespace.QName qName, java.lang.Class<T> aClass) { /* compiled code */ }

    public <T> T getPort(javax.xml.namespace.QName qName, java.lang.Class<T> aClass, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public <T> T getPort(java.lang.Class<T> aClass) { /* compiled code */ }

    public <T> T getPort(java.lang.Class<T> aClass, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public <T> T getPort(javax.xml.ws.EndpointReference endpointReference, java.lang.Class<T> aClass, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public void addPort(javax.xml.namespace.QName qName, java.lang.String s, java.lang.String s1) { /* compiled code */ }

    public <T> javax.xml.ws.Dispatch<T> createDispatch(javax.xml.namespace.QName qName, java.lang.Class<T> aClass, javax.xml.ws.Service.Mode mode) { /* compiled code */ }

    public <T> javax.xml.ws.Dispatch<T> createDispatch(javax.xml.namespace.QName qName, java.lang.Class<T> aClass, javax.xml.ws.Service.Mode mode, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public <T> javax.xml.ws.Dispatch<T> createDispatch(javax.xml.ws.EndpointReference endpointReference, java.lang.Class<T> aClass, javax.xml.ws.Service.Mode mode, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public javax.xml.ws.Dispatch<java.lang.Object> createDispatch(javax.xml.namespace.QName qName, javax.xml.bind.JAXBContext jaxbContext, javax.xml.ws.Service.Mode mode) { /* compiled code */ }

    public javax.xml.ws.Dispatch<java.lang.Object> createDispatch(javax.xml.namespace.QName qName, javax.xml.bind.JAXBContext jaxbContext, javax.xml.ws.Service.Mode mode, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public javax.xml.ws.Dispatch<java.lang.Object> createDispatch(javax.xml.ws.EndpointReference endpointReference, javax.xml.bind.JAXBContext jaxbContext, javax.xml.ws.Service.Mode mode, javax.xml.ws.WebServiceFeature... webServiceFeatures) { /* compiled code */ }

    public javax.xml.namespace.QName getServiceName() { /* compiled code */ }

    public java.util.Iterator<javax.xml.namespace.QName> getPorts() { /* compiled code */ }

    public java.net.URL getWSDLDocumentLocation() { /* compiled code */ }

    public javax.xml.ws.handler.HandlerResolver getHandlerResolver() { /* compiled code */ }

    public void setHandlerResolver(javax.xml.ws.handler.HandlerResolver handlerResolver) { /* compiled code */ }

    public java.util.concurrent.Executor getExecutor() { /* compiled code */ }

    public void setExecutor(java.util.concurrent.Executor executor) { /* compiled code */ }

    public static javax.xml.ws.Service create(java.net.URL url, javax.xml.namespace.QName qName) { /* compiled code */ }

    public static javax.xml.ws.Service create(javax.xml.namespace.QName qName) { /* compiled code */ }

    public static enum Mode {
        MESSAGE, PAYLOAD;

        public static javax.xml.ws.Service.Mode[] values() { /* compiled code */ }

        public static javax.xml.ws.Service.Mode valueOf(java.lang.String s) { /* compiled code */ }

        private Mode() { /* compiled code */ }
    }
}

有人可以解释发生了什么吗?

编辑#1:部署时不会出错,编译时出错。我在上面说得很差。您可以在IntelliJ中看到红色波形。当我尝试向下钻取构造函数时,它会向我显示上面看到的反编译代码。问题是它看起来不像Java 6类,它似乎是Java 5类,但它在我的Java 6 SDK中。此外,有人指出构造函数受到保护,因此我无法使用它。但是,我的类扩展了服务,因此允许使用构造函数。

mvn -v

的输出
<machine_name>:record-replay carlos$ mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 08:51:28-0500)
Maven home: /Users/carlos/workspace/dev/apache-maven/current
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.9.4", arch: "x86_64", family: "mac"

编辑#2: @Didier是的,我可以通过使用Service.class的Jaxb和jaxws版本来解决它,谢谢你。但是我更感兴趣的是,当API说它应该有构造函数时,为什么我的Java 6 SDK中的这个类失败了

1 个答案:

答案 0 :(得分:2)

JDK6中包含的实际javax.xml.ws.Service是来自JAXB / JAX-WS 2.0的实际{{1}},并且没有此构造函数。实际文档为here

您指的是Java EE 6的文档,其中包含带有新构造函数的JAXB / JAX-WS 2.1。

您应该能够在these instructions之后解决您的问题。另请参阅this question