除非.jar包含在bootclasspath

时间:2015-09-16 15:31:53

标签: classpath javac bootclasspath

我正在尝试用gradle构建一个android项目:它是一个带有ndk风格的图书馆项目,加上外部.jar,由Unity提供。

我真的不认为有关gradle文件的详细信息很重要,只需说明我包含外部jar文件(由Unity提供),例如:

  dependencies {
    compile files('libs/unity.jar')
  }

其中实际上似乎正常工作,因为在java编译期间,gradle会发出如下命令:

BASE="<Some directory>"
javac -d "${BASE}/PluginsSources/Android/libproject/build/intermediates/classes/fat/debug" \
    -g -encoding UTF-8 \
    -bootclasspath /Users/myusername/Applications/adt/sdk/platforms/android-23/android.jar \
    -sourcepath "${BASE}/PluginsSources/Android/libproject/build/tmp/compileFatDebugJavaWithJavac/emptySourcePathRef" \
    -classpath "${BASE}/PluginsSources/Android/libproject/libs/unity.jar" \
    "${BASE}/PluginsSources/Android/libproject/src/main/java/org/example/ScriptBridge/JavaClass.java" \
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/r/fat/debug/org/example/ScriptBridge/R.java" \
    "${BASE}/PluginsSources/Android/libproject/build/generated/source/buildConfig/fat/debug/org/example/ScriptBridge/BuildConfig.java" \
    -XDuseUnsharedTable=true
你真实地添加了缩进和BASE变量。请注意,unity.jar是类路径条目。

问题是,编译失败,因为javac显然无法在编译时找到unity.jar中的类,除非将该jar放入-bootclasspath选项(!!)。 / p>

为什么会这样? AFAIK,类的搜索路径应该是层次结构的,在bootclasspath之后,javac应该搜索classpath ...

是否有可能告诉gradle将一些jar粘贴到bootclasspath somhow中(这会笨拙地解决问题)?

是否有更清洁/更好的方式?

感谢您的任何见解!

1 个答案:

答案 0 :(得分:1)

修改

经过仔细审查后,classpath似乎工作(惊喜!)并且Unity Technologies没有创建一个突变类路径弹性罐子,因为它是接管世界,毕竟......

问题在于compile语句的路径,在用正确的jar相对路径替换它后,一切都按预期工作。

问题的答案是:

Q1:为什么会这样?

因为java在一个不存在的jar中找不到类

Q2:是否有可能告诉gradle将一些jar放入bootclasspath somhow?

见下面的答案

问题3:有更清洁/更好的方法吗?

是的:确保你所链接的任何信息的路径都是正确的开头:)

请注意,gradle不会因缺少jar而发出任何错误,即使在调试模式下也是如此(这是一个臭名昭着的恕我直言)。

<小时/> OLD ANSWER

我必须自己解决这个问题,不知何故(我不认为我的解决方案是最佳的,但考虑到这个问题的关注,我猜它会像它一样好得到它...)

Q1:为什么会这样?

据我所知,没有翻转的理由。

文件:

How Classes are Found (Oracle canon)

明确指出bootstrap中的类是:

  

Bootstrap类是实现Java 2平台的类。

即用于实现平台的类。这就是android.jar存在的原因,unity.jar 不应该

Q2:是否有可能告诉gradle将一些jar放入bootclasspath somhow?

是的!以下链接详细说明如何:

Modify bootclasspath in compiler args (gradle forums)

那就是:

allprojects {
  gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
      options.compilerArgs << "Xbootclasspath/a:src/main/libs/unity.jar"
    }
  }
}

,在我的项目中映射到在安装android之后加载unity.jar存档,位于我的android库的src/main/libs目录中。

问题3:有更清洁/更好的方法吗?

我不这么认为,至少在没有理解为什么jar首先需要在引导程序中(这会使大多数问题在这里毫无意义):更改bootstrap类路径不是高级程序员应该做的事情,所以我不希望gradle提供更简洁的捷径。

我还在等待有关这个问题的一些见解的人(我不能把更多的时间花在这上面),但我希望这无论如何都能帮助别人。