Dışa aktarılmayan Java modülüne nasıl erişilir?

Aug 27 2020

JavaFX yerleşik denetimlerini yerelleştirmem gerekiyor. Jigsaw'dan önce bunu başarmanın yolları vardı:

  1. Pakete yerleştirilmesi gereken ek özellikler dosyası aracılığıylacom.sun.javafx...
  2. Yansıma API aracılığıyla, burada gösterildiği gibi

Her iki yöntem de Java modülleriyle uyumlu değildir, çünkü com/sun/javafx/scene/control/*genel API'nin parçası değildir ve farklı projelere ait olsalar bile aynı ada sahip iki paket oluşturmanın bir yolu yoktur.

Dahili pakete erişmek için bu sorunu çözme şansınız var mı? Daha spesifik olarak ControlResources sınıf yükleyicisi.

İlgili sorular:

JavaFx Denetimlerini Yerelleştirme

Yanıtlar

Evan Aug 28 2020 at 13:00

Tamam, bu konuyu araştırırken bütün günü kaybettim.

Kısa cevap: bu mümkün değil.

Uzun cevap

Sen kullanabilirsiniz add-exportsve add-openserişmek için com.sun.javafx.scene.control.skin.resources, ancak adlandırılmış modülleri kullanarak değilse sadece çalışacaktır, başka bir deyişle, uygulama modularized edilmemelidir.

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <configuration>
        <mainClass>${bld.mainClass}</mainClass> <executable>${java.home}/bin/java</executable>
        <options>
            <option>--add-exports</option>
            <option>javafx.controls/com.sun.javafx.scene.control.skin.resources=app.module</option>
            <option>--add-opens</option>
            <option>javafx.controls/com.sun.javafx.scene.control.skin.resources=app.module</option>
        </options>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgs>
            <arg>--add-exports</arg>
            <arg>javafx.controls/com.sun.javafx.scene.control.skin.resources=app.module</arg>
            <arg>--add-opens</arg>
            <arg>javafx.controls/com.sun.javafx.scene.control.skin.resources=app.module</arg>
        </compilerArgs>
    </configuration>
</plugin>

Uygulamanız modülerleştirilmişse bunu alırsınız.

Caused by: java.lang.UnsupportedOperationException: ResourceBundle.Control not supported in named modules
    at java.base/java.util.ResourceBundle.checkNamedModule(ResourceBundle.java:1547)
    at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:1508)

Bunun nedeni, başka bir modülde bulunan kaynaklara erişmenin tek yolunun SPI olmasıdır ( dokümanlar burada ). OpenJFX, ResourceBundleProviderdahili API'nin bir parçası olduğu için kontrollerin uluslararasılaştırılmasına erişim sağlamak için uygulama yapmaz .

Bu nedenle, bu sorun yalnızca OpenJFX geliştiricileri tarafından çözülebilir, ancak son OpenJFX değişiklik günlüğüne bakılırsa, özellikleri değil, yazım hatalarını düzeltmeye yoğunlaşmışlardır.