【问题标题】:java -jar jarname does not unzip all resource filesjava -jar jarname 不解压所有资源文件
【发布时间】:2011-11-05 00:26:02
【问题描述】:

我正在使用 maven 创建一个可执行 jar,并将以下内容添加到我的 pom.xml 下的 build 部分

<build>
.....
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/snmp</directory>
                             <includes>
                                 <include>**/*</include>
                             </includes>
            </resource>
        </resources>
.....
</build>

我使用 maven-shade-plugin 来构建带有依赖项的 jar。

当我在构建后运行命令时

java -jar jarName

它不会解压 src/main/snmp 目录下的所有文件,由于某种原因,它总是每次都解压一个文件(同一个文件)。但是如果我这样做了

jar -xf jarName

这会正确解压缩所有内容。

使用可执行 jar 中的资源我还需要做什么?

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    Java -jar 不应该提取任何东西,它应该运行您在清单中声明的​​任何主要方法。

    “使用可执行 jar 中的资源”是什么意思?如果您的意思是从应用程序内部访问类路径上的资源,如果您做得对,它应该可以正常工作 - 但没有提取。

    【讨论】:

    • 当我说资源时,它必须读取打包为 jar 一部分的 XML 文件并打开该文件,程序使用相对路径。由于java -jar不会解压当前目录下的那些文件,所以程序中提供的路径在文件系统中不存在。
    • 文件应该作为资源打开,而不是文件系统文件。
    • 这是一个第三方依赖。我必须给它一个目录位置。你有什么解决办法吗?
    • 如果您无法控制的组件需要文件系统上的文件,只需给它一个。如果您的目标是分发单个文件,您可能会将该文件作为资源并将其写入文件系统。
    • 不,文件不止一个。我要说的是文件所在的目录,第三方库获取它并读取所有配置。我想我别无选择,只能在运行之前解压缩 jar。不好。
    【解决方案2】:

    命令java -jar jarName.jar 尝试执行在jar 中找到的类,其名称由清单中的Main-Class 属性给出。绝不应该解压缩文件。另一方面,命令 jar xf jarname.jar 应该正是这样做的。

    如果使用java -jar 运行程序会从存档中解压某些内容,那是因为存档中的程序就是为此而设计的。

    【讨论】:

      【解决方案3】:

      您绝对不想提取 JAR 来运行它。应该是自给自足的。将你的资源放在 src/main/resources 中,它们将被构建到你的根目录下的 jar 中。然后使用Class.getResource()Class.getResourceAsStream() 将其作为类路径资源获取。

      编辑:根据您的 cmets,我首先想到的是继续将文件打包到您的 JAR 中,然后在运行时使用 File.createTempFile() 将它们写入默认值临时目录,然后将该目录交给第三方库使用。之后可以使用File.deleteOnExit()进行清理。

      【讨论】:

      • 对 Dave 的回复相同。有一个第三方软件从文件系统中获取路径,它会继续读取其中的所有配置文件,我无法控制它。
      猜你喜欢
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2016-02-11
      • 2018-03-26
      • 2018-06-04
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多