【问题标题】:Android project referencing "normal" java project in eclipse since sdk tools update 17自 sdk 工具更新 17 以来,Android 项目在 Eclipse 中引用“普通”java 项目
【发布时间】:2012-04-10 23:40:25
【问题描述】:

自从最新的 android sdk 以来,我无法再从 eclipse 运行我的 android 应用程序,因为他们无法找到我在其他 eclipse 项目中拥有的类,这些类是通过“正常”构建路径引用的。

这在以前确实有效。并且eclipse中没有编译错误。

是这样吗,现在你必须将这些项目标记为 android 库项目,以防它们被 android 项目引用。

编辑:似乎这就是它被破坏的原因: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

但我仍然需要弄清楚我现在应该如何将我的“普通”java 项目引用到 android 应用程序项目。

【问题讨论】:

  • 什么是运行时错误? ClassNotFound 还是 ClassDefNotFound?
  • java.lang.NoClassDefFoundError
  • 这肯定有用过,我不知道你是怎么做到的。我也有引用其他常规 java 项目的 android 项目,只有当我将常规 java 项目生成的 jar 显式添加到 android 项目构建路径中时,apk 才有效,看起来最新的 SDK r17 完全搞砸了这种行为,现在只接受来自的库 jar预定义的 libs 文件夹。我还没有找到解决方法。
  • 奇怪的是,这曾经对我也有用,但现在坏了。
  • 这似乎现在可以工作 - adt 版本 22.6.1。

标签: java android eclipse android-library


【解决方案1】:

由于 Eclipse 构建工具的最新更新,您还必须在“Java 构建路径”的“订购和导出”选项卡中勾选引用的项目。这为我解决了同样的问题。希望对您有所帮助!

【讨论】:

  • 啊,可惜,我确定就是这样。您是否肯定在“项目”中拥有所有引用的 Java 项目,并在“订单和导出”以及“Android 依赖项”中勾选它们。还要确保您在项目中使用的任何库 jar 都在一个名为“libs”的文件夹中(只要它们在那里,您就不需要在构建路径中手动包含它们,新的 eclipse 工具将自动包含它们)。
  • 是的,我只是仔细检查了一遍,如果这会对这个问题产生任何影响,我会感到惊讶。因为 order 和 export 仅适用于应该将其依赖项转发给任何其他具有它引用的项目的项目。 (就像一个 2 层的依赖层次结构)
  • 我认为您建议的解决方案仅适用于 Android 库项目引用的 Java 项目,如 changelog 中所述,但在这种情况下不适用于:主要 Android 项目直接引用的 Java 项目。
  • 在敲了敲头却没有找到解决方案后,这个简单的步骤对我有用。谢谢。
  • 这 + 对 java6 库的项目的更改起到了作用。谢谢。
【解决方案2】:

link@clamp 提供的有以下句子:

容器现在也将填充库项目引用的纯 Java 项目。

这意味着,我们可以使用一个空的库项目作为 android 项目和常规 eclipse 项目之间的“胶水”项目。只需像这样设置它:

android --> "glue" 项目 --> 常规项目

--> 表示依赖于

胶水项目必须导出常规项目并且必须标记为库。在 android 项目中只需要引用库项目。

现在使用常规的 Eclipse 项目再次对我有用,而“胶水”项目的开销最小。

【讨论】:

  • 虽然我不喜欢这个解决方案,但我仍然会接受它作为答案,因为它有效。
  • 这对我不起作用。由于我升级到版本 21,我无法将外部 Java 项目添加到 Android 项目中。尝试了直接方法和间接方法,但没有任何运气,仍然出现错误,并且 .apk 文件不包含所需的类。
  • 这仍然对您有用吗?我无法让它工作。我创建了一个需要我的 Java LibProject 的 Android GlueProject(在 Properties>Java Build Path>Projects 选项卡下)。我还确保通过检查(在 Properties>Java Build Path>Order and Export 下)导出 LibProject,并通过选中“Is Library”(在 Properties>Android 下)将 GlueProject 标记为库项目。在我想使用 LibProject 的 Android 项目中,我添加了对 GlueProject 的引用(在 Properties>Android 下)。我的 Android 项目编译,但运行时得到 NoClassDefFoundError :/
  • 从头开始,您的解决方案完美运行 :) 问题是我的 Java 项目使用的是 Java 7 而不是 6。切换到 6 后一切正常。
  • 这对我不起作用。胶水项目的 jar 文件不包含引用的 Java 项目的类文件,因此不包含 NoClassDefFoundError。我什至尝试直接引用 bin 文件夹 - 仍然没有成功。是的 - 我选中了“订购和导出”选项卡中的复选框。有人可以发布.classpath 文件吗?
【解决方案3】:

如前所述,Android 不会直接编译和使用您的 Java 项目文件。相反,它只需要 预编译 类文件。

这是我的解决方法,我更喜欢它,因为我不需要仅用于 Android 库的“胶水”项目。主要思想是为 Android 提供一个预构建的 JAR,同时在 Eclipse 中工作时仍然使用库的源代码:

  1. 首先确保库项目是使用 Java 6 编译的。Java 7 将无法工作,Android 将默默地忽略这些库。所以检查工作区设置(Preferences -> Java -> Compiler)和单个项目设置。选择 1.6 作为编译器合规级别。
  2. 右键单击您的 Android 项目 -> Properties -> Java Build Path -> Projects。添加您要在 Android 项目中使用的所有 Java 项目。
  3. 现在,Eclipse 知道这些类(但还不是最终的 Android 构建),因此构建错误已得到解决,并且跳转到一个类会直接导致您的 Java 项目的原始源文件。李>
  4. 在您的 Android 项目目录中添加一个 ant buildscript。该构建脚本将创建一个 JAR,其中包含您项目的所有 .class 文件到 libs 子目录中(this 是让 Android 知道您的 .class 文件的步骤! )。代码见下文。
  5. 现在,并且总是在 Java 项目发生更改时,通过执行 buildscript 来重建 JAR 文件。这也可以自动化,例如“Want an eclipse java project to run ant build files automatically

代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_jar" name="Create Jar with classes from Java projects">
<target name="create_jar">
    <jar destfile="libs/java-projects.jar">
        <!-- "bin" is the class output folder -->
        <fileset dir="path/to/first/java/project/bin"/> 
        <fileset dir="path/to/second/java/project/bin"/>

        <fileset dir="path/to/last/java/project/bin"/>
    </jar>
</target>

【讨论】:

  • 个别项目 > Java 编译器 > 特定项目的 JDK 合规性就足够了,不是吗?并将编译器设置为 1-6 的执行环境(指向实际的 1.6 JVM)。您可能会为我的问题提供一些见解:stackoverflow.com/questions/18981837/…
【解决方案4】:

我添加了一个 ant 项目构建器,它从依赖项目中复制类文件。 ant 文件位于 android 项目中,并从引用的项目中复制类文件。这是蚂蚁:

<?xml version="1.0" encoding="UTF-8"?>
<project name="CommonsCopy" default="copy" basedir=".">
    <target name="copy">
        <copy todir="bin/classes">
            <fileset dir="../Commons/bin" includes="**/*.class">
            </fileset>
        </copy>
    </target>
</project>

要记住的两件事:

  1. 找到一种方法来复制引用的 java 项目使用的 jar 文件,或者直接将它们放入 Android libs 文件夹中。
  2. 引用的项目必须在 1.6 合规级别编译。

【讨论】:

  • 请注意,这里最大的缺点是,如果您更改 java 项目,则需要更改 Android 项目中的一些文件以启动 ant builder。
【解决方案5】:

您可以定义两个项目(一个 Android,一个 vanilla Java)并让一个项目引用另一个项目的源文件,在 Windows 中使用 mklink 命令创建目录连接或文件硬链接。我不知道 linux 等价物,但必须有一个。如果您从一个项目编辑源文件,则另一个项目将不同步,您只需刷新它即可。这样您就不必弄乱 jars 或 Eclipse 构建过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多