2014-02-20 44 views
0

我有一个Java应用程序,我打包成一个JAR。我创建了一个Ant脚本来做到这一点,因为我还需要将资源添加到JAR(图标等)。排除目录及其所有子目录?

现在,我有我在我的项目(Apache HttpClient和JSON库)中使用的库。我也将它们的内容复制到JAR中,因为它是最简单的方法。

我的构建文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project default="create_run_jar" 
    name="Create Runnable Jar"> 
    <target name="create_run_jar"> 
     <jar destfile="C:/Users/Pietu1998/Documents/Java/Whatever.jar" 
      filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" 
        value="net.pietu1998.whatever" /> 
       <attribute name="Class-Path" value="." /> 
      </manifest> 
      <fileset dir="C:/Users/Pietu1998/Documents/Java/Whatever/bin" 
       includes="*.class" /> 
      <fileset dir="C:/Users/Pietu1998/Documents/Java/Whatever/res" /> 
      <zipfileset excludes="META-INF/**" 
       src="C:/Users/Pietu1998/Documents/Java/Whatever/lib/commons-codec-1.6.jar" /> 
      <zipfileset excludes="META-INF/**" 
       src="C:/Users/Pietu1998/Documents/Java/Whatever/lib/commons-logging-1.1.3.jar" /> 
      <!-- More (like 5) JARs --> 
     </jar> 
    </target> 
</project> 

然而,库(JAR文件)有自己的META-INF文件夹,并且他们有很多在他们的东西;像LICENSE,CONDITIONS这样的文件以及Maven的文件夹maven

该项目是为个人使用,所以我只是想摆脱不必要的东西。我试过一些方法来排除所有META-INF的东西,但总是有些东西被遗忘。

  1. excludes="META-INF"留下一切。
  2. excludes="META-INF/**"离开maven文件夹。
  3. **/excludes="META-INF/**",参见上文。

我相信我可以使用很多include-excludes或patternset s,但会导致很多重复。

有没有办法(不适用于这种特殊情况下)排除一个文件夹(META-INF这里)及其所有内容,包括子目录,最好用不太多的重复(对于很多库)?

回答

0

我找到了一种方式来处理星星。

<zipfileset excludes="META-INF/**/*" src="C:\library.jar" /> 

这不包括META-INF文件夹及其所有内容。

  • *意味着它排除了一个文件夹内的所有文件,并
  • foo/**/bar意味着它里面foo任何级别排除bar

因此,foo/**/*排除foo内每个级别上的每个文件。

0

使用excludes="META-INF/**""对我的作品(ANT 1.9.3,Windows 7中,JDK 1.7.0_51)
一些测试下载原始共享记录-1.1.3.jar from here后:

<project> 

<zipfileset excludes="META-INF/**" src="c:/area51/commons-logging-1.1.3.jar" id="foobar"/> 
    <!-- for output line by line --> 
<pathconvert property="foo" refid="foobar"> 
    <map from="c:/area51/commons-logging-1.1.3.jar:" to="${line.separator}"/> 
</pathconvert> 

    <echo>${foo}</echo> 

</project> 

输出包含在类文件只组织/阿帕奇/公/日志/ ..:

[echo] commons-logging-1.1.3.jar 
[echo] org/apache/commons/logging/Log.class; 
[echo] org/apache/commons/logging/LogConfigurationException.class; 
[echo] org/apache/commons/logging/LogFactory$1.class; 
[echo] org/apache/commons/logging/LogFactory$2.class; 
[echo] org/apache/commons/logging/LogFactory$3.class; 
[echo] org/apache/commons/logging/LogFactory$4.class; 
[echo] org/apache/commons/logging/LogFactory$5.class; 
[echo] org/apache/commons/logging/LogFactory$6.class; 
[echo] org/apache/commons/logging/LogFactory.class; 
[echo] org/apache/commons/logging/LogSource.class; 
[echo] org/apache/commons/logging/impl/AvalonLogger.class; 
[echo] org/apache/commons/logging/impl/Jdk13LumberjackLogger.class; 
[echo] org/apache/commons/logging/impl/Jdk14Logger.class; 
[echo] org/apache/commons/logging/impl/Log4JLogger.class; 
[echo] org/apache/commons/logging/impl/LogFactoryImpl$1.class; 
[echo] org/apache/commons/logging/impl/LogFactoryImpl$2.class; 
[echo] org/apache/commons/logging/impl/LogFactoryImpl$3.class; 
[echo] org/apache/commons/logging/impl/LogFactoryImpl.class; 
[echo] org/apache/commons/logging/impl/LogKitLogger.class; 
[echo] org/apache/commons/logging/impl/NoOpLog.class; 
[echo] org/apache/commons/logging/impl/ServletContextCleaner.class; 
[echo] org/apache/commons/logging/impl/SimpleLog$1.class; 
[echo] org/apache/commons/logging/impl/SimpleLog.class; 
[echo] org/apache/commons/logging/impl/WeakHashtable$1.class; 
[echo] org/apache/commons/logging/impl/WeakHashtable$Entry.class; 
[echo] org/apache/commons/logging/impl/WeakHashtable$Referenced.class; 
[echo] org/apache/commons/logging/impl/WeakHashtable$WeakKey.class; 
[echo] org/apache/commons/logging/impl/WeakHashtable.class 

也许你忘了设置从哟更新属性乌尔jar任务为true:

<jar destfile=".." update="true" ..> 

覆盖具有相同名称的一些已经存在的jar文件!?

相关问题