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



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

我有一个项目,我们叫它Primary,它依赖于一些库,比如神奇的Guava。它还取决于我的另一个项目,我们叫它SecondarySecondary项目还具有一些依赖项,例如JDOM2。我在Primary中引用了Ant构建的Jar

让我给你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>
secondary 项目的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的目录中很可能不会(如果会的话,您可以选择不自己分发它们)。

我认为我无法正确地组装类路径,当启动SecondJar时,我总是收到Primary项目中的类或库的NoClassDefFoundError,这是因为我对Ant不是很有经验。我需要为两个项目指定一个类路径吗?将类路径指定为.应该允许我简单地将所有依赖项添加到与SecondaryJar相同的文件夹中,不是吗?

您可以使用MANIFEST。MF"Class-Path:"来交叉引用您的jar。如果它们都在同一个目录下,可能会像下面这样工作(在两个项目中都使用它!):

<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的类路径中应该有secondary.jar, secondary.jar的类路径中应该有guava.jar。

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

如果你打算使用越来越多的库,你可能需要仔细看看ivy甚至maven

相关内容

  • 没有找到相关文章

最新更新