Maven项目-从资源文件夹(项目根)外部加载文件

时间:2018-08-08 12:36:21

标签: java maven

我正在NetBeans中使用Maven创建联系人应用程序。对于程序的运行,我希望用户将图像(联系人头像)添加和存储在文件夹/ avatar中,并在侦听器事件中访问它们。我可以从ProjectRoot / src / main / resources / images目录中访问图像,但是不能访问ProjectRoot / avatars。 注意:我不想将头像存储在资源目录中,因为这些头像将在程序操作期间由用户添加。

我尝试使用getClass()。getResource(avatarPath);就像在类似问题中所建议的那样,但没有奏效。我也尝试过将“ avatars”目录添加到POM作为其自己的资源目录,但这也没有用。

使用Maven时如何访问项目根目录中的文件/文件夹?

listviewContacts.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Contact>() {
        @Override
        public void changed(ObservableValue<? extends Contact> observable, Contact oldValue, Contact newValue) {
            String avatar = newValue.getAvatar();
            String avatarPath = null;
            if (avatar.isEmpty()) {
                avatarPath = "/images/" + DEFAULT_AVATAR; // loads from ProjectRoot/src/main/resources/images
            } else {
                avatarPath = "/avatars/" + avatar; // won't load from ProjectRoot/avatars
            }
            try {
                imageviewContact.setImage(new Image(avatarPath));
            } catch (IllegalArgumentException ex) {
                System.err.println("Could not locate " + avatarPath);
            }
        }

    });

2 个答案:

答案 0 :(得分:0)

您正在混合两种不同的东西。

您既可以将 classpath资源与类一起打包在jarfile中,也可以在将Java显式添加到java classpath中的目录中(使用java -cp命令行参数)。可以通过getClass()。getResource进行访问。

或者您可以使用java.io.File从任意位置加载文件。然后,“ projectRoot”是文件系统中的某个文件夹,您可以对其进行硬编码,通过-DprojectRoot = C:/ fun / with / files进行配置,或者使用一些相对路径。 Maven与它无关,因为化身“将在程序操作期间由用户添加”。

您的用户将不会启动您的IDE,对吗?

答案 1 :(得分:0)

问题在于了解 javafx.scene.image.Image 的不同构造函数在哪里开始。

使用Image的URL构造函数时,URL路径将从 Maven的已定义资源文件夹(/ src / main / resources 或添加到pom.xml中的任何其他资源目录)开始文件):

// the supplied string invokes the URL constructor
Image image = new Image("path/to/file");  

当使用Image的InputStream构造函数(通过FileInputStream)时,该路径将从项目/应用程序的根目录开始:

// the FileInputStream invokes the InputStream constructor
Image image = new Image(new FileInputStream("path/to/file"));