ANT:包含库和许可证问题的方法

时间:2014-06-02 08:52:28

标签: ant classpath

我一直在尝试使用Ant来编译和准备项目以进行分发。我在最终能够解决的问题上遇到了一些问题,但解决方案让我非常不满意。首先,让我解释一下项目的设置及其依赖性。

我有一个项目,我们称之为主要,这取决于几个库,例如梦幻般的Guava。它还取决于我的另一个项目,我们称之为 Secondary Secondary 项目还具有一些依赖项,例如JDOM2。我在主要中使用Jar引用了Ant我构建的内容。

让我告诉你build.xml的有趣内容,这样你就可以了解我在做什么:

<project name="Primary" default="all" basedir=".">  
    <property name='build' location='dist' />
    <property name='application.version' value='1.0'/>
    <property name='application.name' value='Primary'/>
    <property name='distribution' value='${application.name}-${application.version}'/>

    <path id='compile.classpath'>
        <fileset dir='libs'>
            <include name='*.jar'/>
        </fileset>
    </path>

    <target name='compile' description='Compile source files.'>
        <javac includeantruntime="false" srcdir="src" destdir="bin">   
            <classpath refid='compile.classpath'/>
        </javac>
    <target> 

    <target name='jar' description='Create a jar file for distribution.' depends="compile">
        <jar destfile='${build}/${distribution}.jar'>
            <fileset dir="bin"/>
            <zipgroupfileset dir="libs" includes="*.jar"/>
        </jar>
    </target>

Secodnary 项目的build.xml几乎完全相同,只是它需要运行一个清单:

<target name='jar' description='Create a jar file for distribution.' depends="compile">
    <jar destfile='${dist}/${distribution}.jar' basedir="${build}" >    
        <fileset dir="${build}"/>
        <zipgroupfileset dir="libs" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="lu.tudor.ssi.kiss.climate.ClimateChange"/>
        </manifest>
    </jar>      
</target>

在我开始工作之后,尝试了几个小时不将这些依赖项作为类文件包含在内但作为Jar s,我没有时间或洞察力去回去并试图弄清楚我做了什么错误。此外,我认为将这些库包含为类文件是不好的做法,因为它可能会导致许可问题,而不是打包它们,只是将它们包含在构建Jar的目录中很可能不会(如果它会你可以选择不自己分发它们。)

我认为我无法正确组装类路径,在启动 Second 时,我总是在项目中为类或库收到NoClassDefFoundError { {1}},我对Jar的经验不足。我是否需要为两个项目指定类路径?将类路径指定为Ant应该允许我简单地将所有依赖项添加到与 Secondary .相同的文件夹中,如果不是这样的话?

1 个答案:

答案 0 :(得分:0)

您可以使用MANIFEST.MF&#34; Class-Path:&#34;交叉引用你的罐子。 如果它们都在同一个目录中,那么它可能会如下工作(在两个项目中使用它!):

<target name='jar' description='Create a jar file for distribution.' depends="compile">
    <pathconvert property="manifest.classpath" pathsep=" ">
         <path refid="compile.classpath" />
         <flattenmapper />
    </pathconvert>
    <jar destfile='${build}/${distribution}.jar'>
        <fileset dir="bin"/>
        <manifest>
            <attribute name="Class-Path" value="${manifest.classpath}"/>
        </manifest>
    </jar>
</target>

通过这种方式,您可以告诉Java运行时环境,您的jar需要其他人工作,期望它们与您尝试运行的jar位于同一目录中。

结果你的primary.jar应该在它的classpath中有secondary.jar,而secondary.jar在它的classpath中应该有guava.jar。

创建字符串的另一种方法可能是可以处理子目录的ants manifestclasspath任务(https://ant.apache.org/manual/Tasks/manifestclasspath.html)。

如果您要使用越来越多的图书馆,您可能需要仔细研究常春藤甚至是maven。