Java 如何为Android库项目指定多个源目录

Java 如何为Android库项目指定多个源目录,java,android,ant,jar,compilation,Java,Android,Ant,Jar,Compilation,我正在使用ant工具构建android库项目, 我需要指定多个源目录 我试图通过在ant.properties文件中交替添加这些行来指定多个源目录 source.dir=src:src2 source.dir=src;src2 但在这两种情况下都无法构建, 在这两种情况下都生成了.class,但在创建jar文件时,我遇到了这个错误 生成失败 C:\Program Files\Android\Android sdk\tools\ant\build.xml:681:执行此行时发生以下错误:

我正在使用ant工具构建android库项目, 我需要指定多个源目录

我试图通过在ant.properties文件中交替添加这些行来指定多个源目录

source.dir=src:src2    
source.dir=src;src2
但在这两种情况下都无法构建, 在这两种情况下都生成了.class,但在创建jar文件时,我遇到了这个错误

生成失败

C:\Program Files\Android\Android sdk\tools\ant\build.xml:681:执行此行时发生以下错误:

C:\ProgramFiles\Android\Android sdk\tools\ant\build.xml:749:

C:\workarea\Android\Packages\test\src;src2不存在。


有谁能告诉我如何在ant.properties中指定多源目录来构建Android库项目

我以一种巧妙的方式解决了这个问题;给你

要在android中使用多个源目录构建库项目,请首先转到ant.properties文件(对于linux,它是build.properties)并添加source.dir

    source.dir=first_source_dir ;second_source_dir ; third_source_dir
对于lib项目,antout.dir目录中的ant.propertiesbuild.properties文件创建jar库,其中包含编译的.class文件

在创建jar时,antjar中删除所有.java源文件,如果编码器在out.dir目录中保留任何.java源文件,并在source.dir中指定该目录,则该源文件可能包含在jar

现在要删除那些.javasourceant使用以下命令转到source.dir目录

        <property name="source.absolute.dir" location="${source.dir}" />
        dir="${source.absolute.dir}" 

dir=“${source.absolute.dir}”
使用此命令ant实际尝试转到目录

cd   <your_project_root_dir>/first_source_dir ;second_source_dir ; third_source_dir
cd/first\u source\u dir;第二个源目录;第三个源目录
这是不存在的

解决方案:

第一步。首先确保您的源目录(source.dir)和构建目录(out.dir)不同

第二步。转到C:\Program Files\Android\Android sdk\tools\ant openbuild.xml 然后转到jar标记

    <jar destfile="${out.library.jar.file}">                        
       <fileset dir="${out.classes.absolute.dir}"
         includes="**/*.class"
         excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/Manifest.class ${project.app.package.path}/Manifest$*.class ${project.app.package.path}/BuildConfig.class"/>
       <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
   </jar>

现在注释或删除jar标记中的最后一个文件集标记

    <jar destfile="${out.library.jar.file}">                        
       <fileset dir="${out.classes.absolute.dir}"
            includes="**/*.class"
            excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/Manifest.class ${project.app.package.path}/Manifest$*.class ${project.app.package.path}/BuildConfig.class"/>
       <!--fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /-->
    </jar>


现在建立你的项目

至少在更高版本的构建工具上,问题在于输入该属性的值被传递到
中。
location
属性不知道如何处理冒号/分号分隔的路径

修复非常简单,只需使用:

source.absolute.dirs=src1:src2:src3
等等,而不是:

source.dirs=src1:src2:src3

这在不修改SDK文件的情况下为我做到了:

蚂蚁属性:

source.absolute.dir = tmp-src
自定义规则.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="CustomRules">
    <target name="-pre-build" >
        <copy todir="tmp-src" >
            <fileset dir="src" includes="**" />
            <fileset dir="src-1" includes="**" />
            <fileset dir="src-2" includes="**" />
            <fileset dir="src-3" includes="**" />
            <fileset dir="src-4" includes="**" />
        </copy>
    </target>

    <target name="-post-build" >
        <delete dir="tmp-src" />
    </target>
</project>

  • 在项目目录中创建一个目录(比如build\u src)
  • 进入该目录(cd构建\u src)
  • 在build_src中创建软链接(ln-s TARGET linkname),指向所有要包含的源目录 例如:如果您最初的问题是将src1、src2与标准src-dir一起包括在内,请创建指向build\u src下的src1、src2软链接
  • 使用source.dir=build\u src创建ant.properties
  • 这对我来说效果很好,我认为这是最干净的方法(因为这些是到实际源代码的软链接,所以您没有多个源代码副本)

  • 我的一个项目有.aidl文件,aidl抱怨。我没有创建到src的软链接,而是创建了到src/com的软链接并修复了这个问题

  • 如果您确定Android的构建文件提供了这样的功能,请检查delimeter——可能是
    而不是
    。否则,您可能需要修改生成文件。请在此处发布更多信息以获得更好的帮助。如果不使用,可能需要修改ant\build.xml文件,谢谢您的帮助。因此,请发布更多内容,例如构建文件和属性文件的部分内容是否必须在ant.properties文件中完成?难道不能在build.xml中完成吗?我觉得必须修改build.xml文件是很可笑的。你确定这是正确的吗?为什么android不再处理分号/冒号了?为了澄清,这个build.xml位于android SDK中。它不在我的版本控制存储库中。那么,您将如何与多个开发人员一起管理这一点呢。让每个人都修改他们的SDK工具是没有意义的,是吗?@ashoksotree你可以将Android
    build.xml
    复制到重命名为
    Android\u patched\u build.xml
    的项目中,然后修改你的
    build.xml
    以包含另一个文件,而不是
    ${SDK.dir}
    中的文件。这是最好的答案。修改SDK文件完全是个坏消息。这对我来说也非常有效。如果您只需要将其他源文件夹附加到生成,这是最佳解决方案。这是解决方案,而不是已选择为选定解决方案的解决方案。