【问题标题】:Gradle: Fail on adding systemPropertyGradle:添加系统属性失败
【发布时间】:2015-07-25 06:09:19
【问题描述】:

我正在尝试通过我的 Spring Boot 项目上的 gradle 将 .dll 文件添加到“java.library.path”系统属性。我在 STS 上使用 Gradle 2.1。 这是我的 build.gradle 中的一小段凹槽代码:

tasks.withType(JavaCompile) {
    systemProperty "java.library.path", file("./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64")
}

我收到以下错误:

找不到参数 [java.library.path, D:\GitHub\TFG_1\GuiaTV\src\main\resources\META-INF\opencv-2.4.9\windows_bin\x64] on root project 'GuiaTV'] 的方法 systemProperty()

那条路径确实存在,所以我不知道问题出在哪里。

有什么帮助吗?谢谢!

更新 1:

@Amnon 肖特 我尝试做的是将本机库(.dll)添加到项目中。我从一些网站(例如,http://zouxifeng.github.io/2014/07/17/add-system-property-to-spring-boot.htmlhttps://github.com/cjstehno/coffeaelectronica/wiki/Going-Native-with-Gradle)获得了这个想法。

第一个是使用你建议的:

tasks.withType(JavaExec) {
    systemProperty "java.library.path", file("./libs")
}

第二个正在使用:

run {
    systemProperty 'java.library.path', file( 'build/natives/windows' )
}

它们都不适合我。 第一个(使用 JavaExec)未能通过 gradle 测试:

java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)

如果您跟踪跟踪,它会在运行时崩溃:System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

第二个在 gradle build 上失败,并显示以下消息:

Could not find method run() for arguments [build_24sfpo0st6dokeq7fn3ad7r34$_run_closure7@2652c3da] on root project 'GuiaTV'.

幸运的是,您确切地知道我要达到的目标,并且可以解决我的问题。

感谢您的关注!

更新 2:

最后,我最终将这些行添加到我的 build.gradle 脚本中:

// The following makes "gradle build", "gradle test" work
test {
    jvmArgs = ['-Djava.library.path=./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64']
}

// Thw following makes "gradle run" work
run {
    jvmArgs = ['-Djava.library.path=./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64']
}

顺便说一句,我也在使用“spring-boot”gradle 插件。这就是 run 任务的来源。 所以,我可以成功执行“gradle build”、“gradle test”和“gradle run”。也就是说,正确添加了本机库。 但是,由于我也在使用“eclipse”gradle 插件,所以我想通过执行“gradle eclipse”来添加本机库。相反,我必须在 Eclipse 上手动创建库,并将其添加到我的项目中。

感谢@Amnon 的合作。如果我找到它,我将发布一个新的解决方案。

【问题讨论】:

    标签: gradle spring-boot


    【解决方案1】:

    问题是您没有为systemProperty 方法设置上下文,因此Gradle 尝试将它定位在它不存在的project 对象中,这就是您得到错误的原因。

    如果您想将此配置应用于JavaCompile 类型的所有任务,您的代码应该如下所示:

    tasks.withType(JavaCompile) { JavaCompile t ->
        t.systemProperty "java.library.path", file("./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64")
    }
    

    但是,JavaCompile 任务类型也不包含systemProperty,因此此代码也不起作用。

    您可以使用 options 属性为 JavaCompile 任务定义 CompileOptions,即:

    tasks.withType(JavaCompile) { JavaCompile t ->
        t.options "java.library.path", file("./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64")
    }
    

    但是,我不确定您是否可以定义这个特定的系统属性。

    最后一点 - systemProperty 方法确实适用于 JavaExec 类型的任务,以防您打算这样做。

    【讨论】:

    • 关于第一个选项(tasks.withType(JavaExec)...),请注意您应该为特定的迭代任务应用系统属性(即使用JavaExec t -> t.systemProperty...)。另请注意,如果此属性已定义,那么您将覆盖它而不是用您的路径扩展它,这可能是它无法找到某些库的原因。关于第二个选项,run 任务是由application 插件定义的,我猜你不会在你的项目中应用它。关于失败
    • tasks.withType(JavaExec) { JavaExec t -> t.systemProperty "java.library.path", file("./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64") } 也不起作用。它抛出了同样的 UnsatisfiedLinkError,我认为这意味着 opencv_java249 库没有正确添加到 java.library.path。
    • 您能否验证file("./src/main/resources/META-INF/opencv-2.4.9/windows_bin/x64") 确实指向opencv_java249 库的位置?
    • 是的。它包含 opencv_java249.dll,我也尝试将其重命名为“opencv_java249”(无格式),但仍然无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多