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
Java 如何使用jar文件中的数据文件_Java_Maven - Fatal编程技术网

Java 如何使用jar文件中的数据文件

Java 如何使用jar文件中的数据文件,java,maven,Java,Maven,我已经从maven pom文件生成了ba jar文件,并使用pom文件中的resources标记将测试数据文件添加到目标文件夹中。。即使文件在目标文件夹中,jar也无法找到这些文件 情景: joptionpane中有两个按钮,当用户单击该按钮时,目标文件夹中的文件应复制到用户选择目录中。代码在eclipse中工作,但是当我执行Jar文件时,会得到FileNotFoundException Eg代码: File file=new File("Resources/testdata/data

我已经从maven pom文件生成了ba jar文件,并使用pom文件中的resources标记将测试数据文件添加到目标文件夹中。。即使文件在目标文件夹中,jar也无法找到这些文件

情景: joptionpane中有两个按钮,当用户单击该按钮时,目标文件夹中的文件应复制到用户选择目录中。代码在eclipse中工作,但是当我执行Jar文件时,会得到FileNotFoundException

Eg代码:

File file=new File("Resources/testdata/data.xls") ;
我在这里发现了FileNotFoundException。我已经将
资源
目录直接添加到目标中。。我错过了什么吗

代码

POM

新发现: 当我提取Jar文件时,我能够看到testdata文件夹以及我添加的文件。但是我不知道如何使用jar中的文件

inside jar
  |_test data -> data files
  |_other files

现在我想使用jar中的文件。这样,我就可以在不考虑位置的情况下运行,并且可以在没有任何文档的情况下共享Jar

基于此,是否有方法将有效的文件路径传递给getResource方法。

  • java.io.File
    类表示磁盘上的实际文件(而不是jar文件或其他虚拟化资源中的文件),并且不能扩展为表示任何其他文件。因此,不可能使用文件实例来表示资源,您不应该这样做
  • java中几乎所有需要文件的API都有一个重载方法,该方法采用URI和/或InputStream
  • 您可以要求java从java获取类文件的同一位置获取资源(例如,从该jar文件中),以URI或InputStream的形式,然后将其传递给这些API
  • 如果您的API确实只接受文件,那么计划A是使用该库归档一个bug,然后解决它,将数据写入临时目录。当然不推荐,这很麻烦
在名为
example
的类中将资源转换为URI(例如,传递给
ImageIcon
构造函数)的正确方法:

Example.class.getResource("myimg.png");
这与包含
Example.class
的位置(甚至是同一文件夹)完全相同(因此,Example的“package”在资源字符串前面)。如果您希望查看Example.class所在位置的“根”(例如,从包含Example.class的jar文件的根中),请询问
getResource(“/myimg.png”)

对于输入流:

try (InputStream in = Example.class.getResourceAsStream("myicon.png")) {
   // use 'in' here
}

如果找不到资源,这两种方法都返回
null
。如果您请求输入流,您有责任将其关闭,因此请使用try with resources来完成此操作。

这解决了我的问题->请查找以下内容

解决方案

从资源中获取输入流,并根据需要使用该输入流

以下URL中的解决方案

您可能正在尝试使用某种形式的
InputStream
读取文件,因此请尝试
getResourceAsStream(“资源路径”)
。或者,如果您确实需要一个文件,请将流写入一个临时文件并使用它。@Thomas,我正在寻找获取jar文件中存在的文件路径的正确方法,因为如果要与对等方共享,我可以直接共享这个jar,而无需手动添加任何数据文件,而且代码运行良好,Eclipse IDE中没有任何问题,唯一的失败是处理jar(放置在某个随机位置并执行该jar)没有“文件”在那个jar中,只是一个资源,很像zip归档中没有文件,只有zip条目(事实上,jar文件是zip归档)。您可以将这些文件提取到文件中,但无法通过简单的文件路径从外部访问它们。因此,如果需要,可以将资源提取到文件中,也可以简单地使用资源。-还有一个关于IDE使用的注意事项:IDE很可能使用未打包的类和资源,因此没有jar(目前),因此资源实际上是文件。@Thomas,因此不可能访问jar中的文件。。如果有办法的话,我该怎么做呢。我会检查这个解决方案,但不管怎样,我都在做与您提到的从class
getClass().getClassLoader().getResource(“testdata/ResetPassword\u UI/New\u User\u Creation\u Data.xls”).toURI()获取资源相同的事情。这行不通吗?@Satish一旦你有了URI你会怎么做?阅读此答案中的第一个要点:您不能将uri作为路径传递给
文件
,并期望它可读。
getClass().getClassLoader().getResource
这是双重破坏;在某些情况下,这将失败。它也不是惯用语,而且不需要太长
YourClass.class.get…
是您想要的(在引导方案中加载时失败,在子类化时失败)。您需要复制jar中资源的确切路径,包括前导斜杠,并将其传递给
MyClass.class.getResource
。是的,正如Thomas所说,如果您将该URI传递给
new File()
构造函数,则无法工作。如果
文件
在源文件中的任何位置,这将不起作用,它必须离开。不,您需要阅读答案。我告诉泰德:只要你使用java.io.File,这就永远不会起作用,句号-没有理由使用它,你一直完全忽略这个建议。只要你忽视它,你就无法解决这个问题,我或其他人在这里也无能为力。
inside jar
  |_test data -> data files
  |_other files

Example.class.getResource("myimg.png");
try (InputStream in = Example.class.getResourceAsStream("myicon.png")) {
   // use 'in' here
}
ResetPasswordUI.class.getClassLoader().getResource("New_User_Creation_Data.xls").openStream()