对于一个 java 项目,我想将它依赖的所有第三方 jar 合并到由 Apache Ant 创建的主 jar 中,我已经设法做到了。
问题是其中一些 jar 文件在其 META-INF
中有签名文件。 -directories,所以当我尝试运行我的 jar 文件时,我收到错误消息 "Invalid signature file digest for Manifest main attributes"
.在我手动删除签名文件后,错误消失了。
我尝试使用 excludes
过滤掉我的 ant 文件中的签名文件-属性或exclude
-tag,但似乎没有任何效果。
这是 Ant 任务:
<target name="jar" description="Creates the jar file">
<mkdir dir="${jar}"/>
<jar destfile="${jar}/${ant.project.name}.jar" level="9" filesetmanifest="mergewithoutmain">
<zipgroupfileset dir="${lib}" includes="*.jar"/>
<zipfileset dir="${class}"/>
<manifest>
<attribute name="Main-Class" value="${mainclass}"/>
</manifest>
</jar>
</target>
如何在这个 ant 任务中从生成的 jar 中过滤文件?谢谢你的帮助!
最佳答案
几个小时以来一直在同一个问题上苦苦挣扎,所以最终通过扩展现有任务来编写一个新任务:
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import org.apache.tools.ant.taskdefs.Jar;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.ZipFileSet;
public class CustomizedJarTask extends Jar {
protected Set<String> filters;
@Override
public void add(ResourceCollection resources) {
if (filters != null && resources instanceof ZipFileSet) {
ZipFileSet set = ZipFileSet.class.cast(resources);
for (String filter : filters)
set.createExclude().setName(filter);
}
super.add(resources);
}
public void setFilters(String patterns) {
StringTokenizer tokenizer = new StringTokenizer(patterns, ", ", false);
while (tokenizer.hasMoreTokens()) {
if (filters == null)
filters = new HashSet<>();
filters.add(tokenizer.nextToken());
}
}
}
有了以上内容,我在构建文件中只需要:
<taskdef name="customized-jar" classname="CustomizedJarTask" classpath="${basedir}/bin/" />
<customized-jar jarfile="${directory.build}/external-libs.jar" duplicate="fail" filters="META-INF/**">
<zipgroupfileset dir="${directory.libs}">
<include name="**/*.jar" />
</zipgroupfileset>
</customized-jar>
关于Ant:从合并的 jar 文件中排除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274879/