我们可以使用 jaxws-rt.jar 作为运行时实现,尽管它包含 sun 库吗?

can we use jaxws-rt.jar as runtime implementation though it includes sun libraries?

许多人出于各种原因建议不要使用 sun 包。提供了详细的答案 here.

但是我使用的是 jaxws-rt.jar,它使用 sun 库。

我在想我是否应该jaxws-rt.jar。我在 tomcat 容器中 运行,我不想包含 Jboss、GlassFish 或任何其他应用程序服务器的 jaxws 实现。

这是我正在尝试做的事情(设置连接和请求超时)

import com.sun.xml.internal.ws.client.BindingProviderProperties;
import javax.xml.ws.BindingProvider;

((BindingProvider)soapService).getRequestContext()
        .put(BindingProviderProperties.REQUEST_TIMEOUT,REQUEST_TIMEOUT_MILLI);
((BindingProvider)soapService).getRequestContext()
        .put(BindingProviderProperties.CONNECT_TIMEOUT,CONNECT_TIMEOUT_MILLI);

谢谢

如您所见,某些行为(例如连接超时)是通过特定于实现的方式来控制的。

如果您不热衷于针对(导入)com.sun 包进行编译,一种删除编译时依赖项但设置这些属性以按照您需要的方式控制 JAX-WS 参考实现的方法,您可以尝试通过 string values 为参考实现设置 BindingProvider 请求上下文属性。即使 运行 其他 JAX-WS 运行时而不是 RI,您也可以设置这些属性 - 它不会失败(它可能没有效果)。

import javax.xml.ws.BindingProvider;

((BindingProvider)soapService).getRequestContext()
    .put("com.sun.xml.ws.request.timeout", 5000L);
((BindingProvider)soapService).getRequestContext()
    .put("com.sun.xml.ws.connect.timeout", 5000L);

这是您问题中两个常量的两个值。 JAXWSProperties.CONNECT_TIMEOUT and BindingProviderProperties.REQUEST_TIMEOUT

这是误会。

even though it includes sun libraries?

它没有 'include sun libraries'。它 引用 一个 com.sun 库。那是完全不同的事情。两个完全不同的东西。

Many recommend not to [use] sun packages for various reasons.

只有一项推荐很重要,那就是 Note about sun.* packages。其中的执行语句是:

Programs that contain direct calls to the sun.* packages are not 100% Pure Java.

sun.* 包当然是有原因的,那就是为 JDK 中的各种事物提供实现。如果这是您的程序对这些 类 的唯一用途,特别是如果您的代码不包含 'direct calls to the sun.* packages',则您无需担心任何事情。