如何从外部包资源导入 CSS 文件

How to import a CSS file from an external bundle resource

我正在尝试从另一个名为 cssBundle 的包中导入 OSGi 包资源 (名为 CSS 的文件 style.css) :

public void addCSS() {
    Bundle bundle = FrameworkUtil.getBundle(this.getClass());
    Bundle[] bArray = bundle.getBundleContext().getBundles();
    Bundle cssBundle = null;
    for (Bundle b : bArray) {
        if (b.getSymbolicName().equals("cssBundle")) {
            cssBundle = b;
            break;
        }
    }
    Enumeration<URL> resources = null;
    try {
        resources = cssBundle.getResources("/resources/css/mainscreen.css");
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (resources != null) {
        URL myCSSURL = resources.nextElement();
        try {
            URI uri = myCSSURL.toURI();
            File f = new File(uri);
            scene.getStylesheets().add("file:///" + f.getAbsolutePath().replace("\", "/"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }
}

然而,这样,我得到:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: URI scheme is not "file"
at java.io.File.<init>(Unknown Source)

什么是正确的或更好的方法?

System.out.println(myCSSURL);

输出

bundle://13.1:1/resources/css/style.css  

有没有一种方法可以在不使用 URL 的情况下将其添加到我的场景中?

该异常意味着它找不到您的文件。您应该调查创建 CSS 文件的 URI。

URI uri = new URI("file:///C:/other/mydir/myfile.txt");

表示资源包资源的 URI 不能表示为文件。所以从 URI 创建文件的方法是不可能的。

您可以对捆绑资源执行的操作是为其获取 InputStream。因此,您可以使用它将流内容复制到临时文件夹中的文件,并将该文件提供给 scene.getStylesheets().add.

另一种方法可能是在您的包中为 resources.css 定义一个 Import-Package。这将使该文件在您的包的类路径中可用。所以也许 scene.getStylesheets().add("/resources/css") 然后会起作用。