我正在尝试用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中(这会笨拙地解决问题)?
是否有更清洁/更好的方式?
感谢您的任何见解!
答案 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提供更简洁的捷径。
我还在等待有关这个问题的一些见解的人(我不能把更多的时间花在这上面),但我希望这无论如何都能帮助别人。