当前位置: 首页 > 知识库问答 >
问题:

Apache CLI、可执行jar、classLoader().getResource()

谭刚毅
2023-03-14

我的目标是使用Apache CLI和可执行jar文件读取文本文件,执行字符串操作,然后写入CSV。您可以在终端中执行该工具,如下所示:

$ java -jar my-tool-with-dependencies.jar -i input.txt -o output.csv

我已经为这个功能编写了测试,这些测试正在通过。测试输入文本文件位于src/test/resources/中。以下测试正在通过:

@Test
public void testWordockerWriteCsvFileContents() {
// Make sure the csv file contains contents

Wordocker w = new Wordocker();

String intext = "/textformat/example_format.txt";
String outcsv = "/tmp/foo.csv";

w.writeCsvFile(intext, outcsv);

try {

Reader in = new FileReader(outcsv);
Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
for (CSVRecord record : records) {
    assertTrue(record.toString().length() > 0);
}
} catch(FileNotFoundException e){
    assertTrue(false);
} catch(IOException e) {
    assertTrue(false);
}

File file = new File(outcsv);
if (file.exists()) {
    file.delete();
}

}

我们使用mvn clean compile assembly:single编译带有依赖项的jar文件,然后引发以下FileNotFoundException:

    // Get file from resources folder
    URL resourceURL = ParseDoc.class.getClassLoader().getResource(fileName);

    if (resourceURL == null) {
    throw new FileNotFoundException(fileName + " not found");
    }
    file = new File(resourceURL.getFile());

这使我认为parsedoc.class.getClassLoader().getResource(fileName);查找文件的位置存在问题。我知道有人问过的相关问题。相关问题如下:

  • 可执行JAR中class.getResource()和classLoader.getResource()的奇怪行为
  • class.getResource()和classLoader.getResource()之间有什么区别?
  • MyClass.Class.GetClassLoader().GetResource(“”).GetPath()引发NullPointerException
  • This.GetClass().GetClassLoader().GetResource(“…”)和NullPointerException
  • GetResourceStream返回NULL

这些问题似乎都不是关于如何将可执行jar与Apache CLI一起使用的。我认为基本问题是URL resourceURL=parsedoc.class.getClassLoader().getResource(fileName);找不到我的命令行参数给出的文件路径。

请让我知道你的想法。谢谢你抽出时间。

共有1个答案

谷德本
2023-03-14

在通过评论讨论后,我也将此作为答案:

classloader.getResource()只获取作为jar文件的一部分打包的文件或位于classpath文件夹中的文件。

为了读取普通文件,您可以使用与第一个示例类似的内容,即FileReaderFileInputStream,或者根据您尝试使用的库支持的内容传递java.io.file

 类似资料:
  • 我在Eclipse中有一个maven项目。在src/main/resources下,我有一个名为“directoryToCopy”的目录,其中包含文件。一旦我运行了我的项目,我想将“directoryToCopy”复制到桌面上的本地目录“localDirec”下。 我用了这个: 这在本地工作正常,但是当我想将其作为可执行jar文件运行时,我会得到NullPointerException。 请问有什

  • 我在Netbeans IDE 8.0.1中编写了一个名为SampleChat的Java GUI程序,并使用“Clean and Build”函数创建了一个jar文件。 我转到Netbeans创建的'dist'目录,双击它生成的jar文件。打开一个cmd窗口,其行如下: 我打算从一个U盘共享程序,所以它是至关重要的,唯一的要求是一个JVM,鼠标,也许一些手指来双击它。 我想出的一个尴尬的解决方案是编

  • 问题内容: 我使用eclipse创建可执行jar。它依靠外部其他罐子。 在Eclipse中,只需选择即可。 您可以创建一个可执行jar。它可以在安装了jre的任何地方执行。 但是如果我使用命令行来编译jar。 它可以生成jar。但是jar只能在产生它的目录中执行。如果我将其放入另一个目录或计算机,则会抱怨。 因此,我的问题是,如何使用命令行作为Eclipse生成可执行jar。 问题答案: jar文

  • 提前道谢。 更新:在另一台机器上尝试相同的jar后,问题会改变。现在,我可以确认这些图像不是可执行的“胖”jar的一部分,因为这些图像不会出现在网页上。更进一步说,“webapp”下的文件没有一个打包在jar中。我已经把spring-boot-maven-plugin插件放在pom中,并使用“mvn package”来创建JAR。在我的src项目中,webapp在src/main之下(与java和