Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX Font.loadFont()在使用Maven时始终为null_Java_Maven_Javafx_Fonts - Fatal编程技术网

JavaFX Font.loadFont()在使用Maven时始终为null

JavaFX Font.loadFont()在使用Maven时始终为null,java,maven,javafx,fonts,Java,Maven,Javafx,Fonts,我一直在努力修复我遇到过的最困难的bug,任何能帮忙的人都能得到10块饼干。我制作了两个完全相同的JavaFX应用程序,一个使用Maven,另一个没有构建工具。在没有构建工具的情况下创建的应用程序按预期运行,Maven应用程序总是在Font.loadFont()上返回null,因此它抛出null指针异常。我已经将问题简化为非常简单的应用程序 以下是不使用Maven的应用程序: 上述代码的文件结构、编译和执行: 现在查看问题部分 下面是使用Maven的项目中几乎相同的代码: package t

我一直在努力修复我遇到过的最困难的bug,任何能帮忙的人都能得到10块饼干。我制作了两个完全相同的JavaFX应用程序,一个使用Maven,另一个没有构建工具。在没有构建工具的情况下创建的应用程序按预期运行,Maven应用程序总是在Font.loadFont()上返回null,因此它抛出null指针异常。我已经将问题简化为非常简单的应用程序

以下是不使用Maven的应用程序: 上述代码的文件结构、编译和执行:


现在查看问题部分 下面是使用Maven的项目中几乎相同的代码:

package test.font;

import javafx.application.Application;
import javafx.scene.text.*;
import javafx.stage.Stage;

public class App extends Application {

    public static void main(String[] args) {

        launch(args);

    }

    @Override public void start(Stage stage) {

        Font.loadFont(App.class.getResource("test/font/Raleway-Medium.ttf").toExternalForm(), 50);

        for (String family : Font.getFamilies())
            if (family.equals("Raleway Medium"))
                System.out.println("The font is loaded");

    }

}
这里是pom.xml,这可能是我搞砸的地方:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>test.font</groupId>
        <artifactId>font-test</artifactId>
        <packaging>jar</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>font-test</name>
        <url>http://maven.apache.org</url>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

我知道这是一个很奇怪的问题,可能有一个简单的答案。我对Maven有些陌生,所以谢谢你的耐心。如果值得一提的话,我在Ubuntu 18上。

如果您使用的是maven,那么它会尝试从
resources
文件夹中获取资源文件,如果它们不在那里,它会给您
NPE
,因为它找不到资源。一种解决方案是将字体放入resources文件夹

另一个解决方案是在
pom.xml
中插入以下内容,然后您可以将文件放入任何包中。 我没有尝试过使用字体,但我使用了
.fxml
.css
文件,它对我很有用

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <targetPath>${project.build.outputDirectory}</targetPath>
            <includes>
                <include>**/*.ttf</include>
                 <!--here you can also insert your .fxml files or .css files for example-->
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

src/main/java
${project.build.outputDirectory}
**/*.ttf
src/main/resources

Maven默认有一个单独的资源目录:

src/main/resources/test/font/Raleway-Medium.ttf

然后使用路径
/test/font/ralway Medium.ttf

将资源复制到jar中,您可以试试“/test/font/ralway Medium.ttf”或“/ralway Medium.ttf”吗Maven声明了严格的项目结构。据她说,资源(未编译的文件)分别放在目录
src/main/resources
src/main/filters
)和目录tests
src/test/resources
src/test/filters
)中。如果不满足此要求,maven将不会将它们复制到目标目录如果您的字体与App类位于同一个包中,那么它应该是
getClass().getResource(“Raleway Medium.ttf”).toExternalForm()
不带任何斜杠,与不带maven一样DarkMental(部分)和wallek876是正确的:当您使用
getResource时(字符串)
不带前导的
/
它相对于
类进行搜索。资源的路径应为
“ralway Medium.ttf”
“/test/font/ralway Medium.tff
”Maven只识别
src/main/java
中的
.java
文件,这意味着您的资源不会被复制到
target/classes
目录中。目录结构的映像中存在
target/classes/test/font/ralway Medium.tff
这一事实实际上很奇怪你是手动放在那里的吗?以上所有的都是正确的。我通过创建resources文件夹,将字体放在那里,并在URI前面添加一个/来解决这个问题。谢谢大家!
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <targetPath>${project.build.outputDirectory}</targetPath>
            <includes>
                <include>**/*.ttf</include>
                 <!--here you can also insert your .fxml files or .css files for example-->
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>
src/main/resources/test/font/Raleway-Medium.ttf