【发布时间】:2020-10-23 08:16:16
【问题描述】:
我关注了The Java Archive Tool,但找不到如何排除文件夹。
例如,我有工作副本目录下的文件:
workingcopy
--src
--.svn
-- com
--.svn
--WebContent
我想仅从src 下的类编译和创建 jar,不包括所有以 .svn 目录开头的文件夹。我想从cmd 像jar -cf test.jar 等运行它。
我该怎么做?
【问题讨论】:
我关注了The Java Archive Tool,但找不到如何排除文件夹。
例如,我有工作副本目录下的文件:
workingcopy
--src
--.svn
-- com
--.svn
--WebContent
我想仅从src 下的类编译和创建 jar,不包括所有以 .svn 目录开头的文件夹。我想从cmd 像jar -cf test.jar 等运行它。
我该怎么做?
【问题讨论】:
这可以通过一个命令来完成:
jar cf test.jar `find . -not -path "*/.svn/*" -not -type d`
jar 的问题在于,如果传递了目录,它将递归地添加 all 内容。所以我们的目标是只传递文件,并且只传递那些在路径中没有'.svn'子字符串的文件。为此,find 命令与 2 个条件一起使用:
-not -path "*/.svn*"过滤掉所有svn文件-not -type d 过滤掉所有目录不过,这将从 jar 中排除空目录。
【讨论】:
这可能是解决您的问题的实用解决方法:它不会排除 subversion 目录(目录),而是仅包含类文件(假设您不放版本控制下的类文件):
jar -cf test.jar *.class
进一步增强:将代码与类文件分开。无论如何,您都不想签入类文件(构建工件):
workingcopy
--src
--.svn
-- com // only *.java files in here and below
--.svn
--WebContent
--bin
--com // only *.class files in here and below
【讨论】:
javac 编译 java 源文件和(可选)jar 创建库。 jar 无法编译并且您不需要需要 ant 或 maven,但尤其是 ant 极大地简化了构建过程(但您必须学习/理解 ant 基础知识)。 maven 更加简化,但 maven 有点难以理解。它需要(永久)互联网连接。
SVN中有一个概念叫做Export。如果您使用它,您将获得没有 .svn 存储库的结构。它与退房略有不同。
在此之后,您必须能够从该目录而不是存储库文件夹执行常规 jar 命令。
【讨论】:
正如javamonkey79 所说,我认为您不能仅使用jar 工具本身来做到这一点。你应该做的是考虑ant,以及它的jar task。
【讨论】:
从 Java 11 开始,您可以使用感叹号 (!) 排除文件或文件夹,用竖线 (|) 分隔 例子:
jar cvf MyJarFile.jar !(file1)
jar cvf MyJarFile.jar !(file1|folder1)
在 Java 8 jar 上,使用 find from @silnijlos 查看最佳答案
如果有可用的 maven、ant 或 gradle,您也可以使用,参考 maven:
http://maven.apache.org/plugins/maven-war-plugin/examples/including-excluding-files-from-war.html
【讨论】:
看起来 jar 程序本身无法做到这一点。您将需要添加一些其他类型的脚本来完成您正在寻找的内容。
看起来你可能正在使用 Windows,所以我猜你可以这样写这些缺失的部分。
希望这会有所帮助。
【讨论】: