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

Java Maven项目-从资源文件夹(项目根目录)外部加载文件,java,maven,Java,Maven,我正在使用Netbeans中的Maven创建一个联系人应用程序。对于程序的操作,我希望用户在文件夹/化身中添加和存储图像(联系化身),并在侦听器事件中访问它们。我可以从ProjectRoot/src/main/resources/images目录中访问图像,但无法访问ProjectRoot/avatars。注意:我不想将化身存储在资源目录中,因为这些将在程序操作期间由用户添加 我尝试过使用getClass().getResource(avatarPath);正如在类似问题中所建议的,但它没有起作

我正在使用Netbeans中的Maven创建一个联系人应用程序。对于程序的操作,我希望用户在文件夹/化身中添加和存储图像(联系化身),并在侦听器事件中访问它们。我可以从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);
            }
        }

    });
listviewContacts.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

公共空间改变了(可观察值你混合了两种不同的东西

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

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


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

问题在于理解javafx.scene.image.image的不同构造函数从何处开始

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

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

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

感谢您的回复。我可能确实误解了一些事情,但似乎Maven与此有关?我可以访问资源目录中的文件,但不能访问项目的根目录。例如,在提供的代码中,图像在资源目录中时加载,但如果我尝试访问,则不会加载这可能是Maven的配置问题,也可能不是,但我不知道为什么它会从/src/main/resources/images加载,而不是从/avatars加载。Maven会将src/main/resources打包到您的JAR文件中,因此图像在getClass().getResource()中可用。如果你想让maven在你的JAR文件中添加一些不同的文件夹,那么你可以在pom.xml.Spelina中配置(),是的,我已经尝试了所有这些,我已经访问了你在我发布之前提供的链接。你可以在我的原始帖子中看到“我也尝试了添加”化身“将目录作为其自己的资源目录发送到POM,但这也不起作用。”。"它不起作用。这就是我问这个问题的原因。我理解Maven和资源目录,正如我在我的原始帖子中试图阐明的那样。我不想将/avatars文件夹打包到jar中。这是一个应用程序在运行时将图像保存到的位置。现在你看到了我的困境;所有这些都不起作用了……现在比较一下你的answer与我的:D。同时尝试在IDE之外运行应用程序,然后再次检查我的答案:
// the FileInputStream invokes the InputStream constructor
Image image = new Image(new FileInputStream("path/to/file"));