40552


Java9でアプリケーションを作成しているのですが、  
Linux環境でコマンドでコンパイルを行う際に下記のようなエラーが出てしまいます。

* * *
[code]

    /var/java/jdk-9.0.1/src/Test.java:6: error: cannot access Service
            ApiService port = api.getApiServicePort();
    
      class file for javax.xml.ws.Service not found
    warning: unknown enum constant XmlAccessType.FIELD
      reason: class file for javax.xml.bind.annotation.XmlAccessType not found
    1 error
    1 warning
    
[/code]

* * *

Windows環境のEclipseで実行した際にはエラーが出なかったので  
原因が分からないでいます。

お手数ですが、ご回答よろしくお願い致します。


CC BY-SA 3.0
2017-12-26T03:53:17.123
40537
2018-01-28T05:50:51.667
2017-12-26T15:46:00.390
754
26782
question
java
Java9でのjavax.xml.ws.Serviceクラスの利用について


  * [ヌーラボのアカウント基盤を Java 9 にマイグレーションして起きた問題と解決法 | ヌーラボ](https://nulab-inc.com/ja/blog/nulab/java9-migration/)

の「Java SE の EE モジュール (java.se.ee) がデフォルトで実行できなくなった」で書かれている事象と同じかと思われます。

[`javac`](https://docs.oracle.com/javase/9/tools/javac.htm#GUID-
AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9__GUID-
AEF06674-4D9F-4BCF-90EC-F3FBA615F57A)(及び実行時には[`java`](https://docs.oracle.com/javase/9/tools/java.htm#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE__GUID-688B46ED-0337-4066-B40C-499731FE7F4B))コマンド引数に
`--add-modules java.xml.ws` を付与することで問題は回避できるでしょう。

オフィシャルのマイグレーションガイドの該当記述はこちらになります:

  * [Modules Shared with Java EE Not Resolved by Default - Java Platform, Standard Edition Oracle JDK 9 Migration Guide, Release 9](https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-F640FA9D-FB66-4D85-AD2B-D931174C09A3)

* * *

[`javax.xml.ws.Service`のJavaDoc](https://docs.oracle.com/javase/jp/9/docs/api/javax/xml/ws/Service.html)を参照するとこのクラスは`java.xml.ws`モジュールに属していることがわかると思います。  
このモジュールは、JavaEE向けであるとして、JDKからは削除されることになりました。  
Java9ではまだ削除されておらず、デフォルトでは参照できなくなっているだけなので、必要があれば(明示的に指定することで)利用可能です。

[JEP 261: Module System](http://openjdk.java.net/jeps/261):

> Modules that define Java EE APIs, or APIs primarily of interest to Java EE
> applications, have been deprecated and will be removed in a future release.
> They are not resolved by default for code on the class path:
>
> The default set of root modules for the unnamed module is based upon the
> java.se module rather than the java.se.ee module. Thus, by default, code in
> the unnamed module will not have access to APIs in the following modules:
>
> java.activation  
>  java.corba  
>  java.transaction  
>  java.xml.bind  
>  **java.xml.ws**  
>  java.xml.ws.annotation
>
> (中略)
>
> These modules are still part of JDK 9. Code on the class path can be granted
> access to one or more of these modules, as needed, via the --add-modules
> option.

* * *

ちなみにOracle JDK 9.0.1では次のようなエラーメッセージとなるようでした:

> パッケージjavax.xml.wsは表示不可です  
>  (パッケージjavax.xml.wsはモジュールjava.xml.wsで宣言されていますが、モジュール・グラフにありません)


CC BY-SA 3.0
2017-12-27T08:25:59.913
40552
2018-01-28T05:50:51.667
2018-01-28T05:50:51.667
2808
2808
40537
answer