将jar文件解压到指定目录

91

我想使用jar命令行工具将我的一个jar包提取到指定目录。

如果我理解正确的话,-C选项应该可以实现,但是当我尝试时:

jar xvf myJar.jar -C ./directoryToExtractTo

我正在从我的jar工具获取使用信息,所以我做错了什么。

我想要的东西是否可以通过jar实现,还是我需要手动移动我的jar并在那里调用?

jar xvf myJar.jar

3
我认为 -C 只是用于添加文件。 - Paul Grime
也许,我认为这也是用于指定输出目录的。 - Andna
8个回答

98

jar使用zip压缩,因此您可以使用任何解压缩工具。

示例:

$ unzip myJar.jar -d ./directoryToExtractTo


17
在 Xubuntu 12.04.1 中,执行命令 unzip myJar.jar -d out-directory 将解压缩 myJar.jar 文件到 out-directory 目录中。 - Petr Újezdský
1
过去我使用zip创建jar时遇到了问题(这与使用jar命令不等同),但我不能对解压缩发表意见。我的建议是自行决定是否使用此方法,最好使用jar命令。 - Ring
gunzip 抱怨 jar 文件有多个条目。 - Almo
1
在RHEL6上没有任何问题...为什么Java中的所有东西都是半成品的? - niken
如果unzip不在路径中,例如在某些distroless容器中,只有jar可用... - WesternGun

78

最好这样做。

导航到您需要的文件夹结构

使用命令

jar -xvf  'Path_to_ur_Jar_file'

12
当然,我能够做到这一点,并且我同意我可以这样做,我只是想知道是否我错解了“-C”选项,似乎情况确实是这样的。 - Andna
也许这是通过“jar xf”指定目标位置的唯一方法。 - Eric
2
如果你想像我一样在单行中输入:cd /my/path && jar -xvf 'Path_to_ur_Jar_file' - Ring

13

在jar命令本身中没有这样的选项。请参阅文档

-C dir 在处理以下inputfiles参数时,在执行jar命令期间暂时更改目录(cd dir)。 它的操作旨在类似于UNIX tar实用程序的-C选项。例如:jar uf foo.jar -C classes bar.class更改为classes目录,并将该目录中的bar.class添加到foo.jar中。以下命令,jar uf foo.jar -C classes . -C bin xyz.class更改为classes目录,并向foo.jar添加所有classes目录中的文件(无需在jar文件中创建classes目录),然后在更改为bin目录以将xyz.class添加到foo.jar之前,返回原始目录。如果classes包含bar1和bar2文件,则使用jar tf foo.jar查看jar文件的内容如下:

META-INF/

META-INF/MANIFEST.MF

bar1

bar2

xyz.class


8
如果您不想更改当前的工作目录,可以像这样在子shell中运行提取命令,这可能更容易。
mkdir -p "/path/to/target-dir"
(cd "/path/to/target-dir" && exec jar -xf "/path/to/your/war-file.war")

你可以从任何工作目录执行此脚本。
[感谢David Schmitt的子shell技巧]

5

这对我很有用。

我创建了一个文件夹,然后使用命令提示符中的CD选项进入该文件夹。

然后在那里执行了jar文件。

d:\LS\afterchange>jar xvf ..\mywar.war

2
这是我在 .bat 文件中使用的内容。当然,这只适用于 Windows。
set CURRENT_DIR=%cd%
mkdir ./directoryToExtractTo
cd ./directoryToExtractTo
jar xvf %CURRENT_DIR%\myJar.jar
cd %CURRENT_DIR%

set CURRENT_DIR=%cd% mkdir -p directoryToExtractTo cd "directoryToExtractTo" jar xvf %CURRENT_DIR%\myJar.jar cd %CURRENT_DIR% - Bhaskara Arani

0

可能有点过头了,但这是我想要的东西,所以我为它编写了一个 Bourne Shell 脚本(依赖于 sedgrep):

Usage: unjar FILE [DEST]

- DEST must not already exist (won't overwrite existing contents);
  path to DEST will be created.

- If DEST is not provided, defaults to a subdirectory in the current
  working directory that will be named after FILE without the extension.
  Ex: unjar foo.jar  # foo.jar extracted to ./foo

- If DEST is provided, the path will be created and the jar will
  be extracted into it.
  Ex: unjar foo.jar /a/b/c  # foo.jar extracted into /a/b/c

完整的脚本在此gist处。


0

截至2020年10月的当前工作版本,已更新为使用maven-antrun-plugin 3.0.0。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>prepare</id>
                    <phase>package</phase>
                    <configuration>
                        <target>
                            <unzip src="target/shaded-jar/shade-test.jar"
                                   dest="target/unpacked-shade/"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接