Почему моя задача deploy1Node терпит неудачу, жалуясь на java.lang.ClassCastException: sun.nio.fs.UnixPath не может быть приведен к java.lang.String? - PullRequest
0 голосов
/ 23 января 2019

У меня рабочая сборка Corda Gradle. Наша задача deploy1Node работает правильно через IntelliJ, через cmd в Windows и через iTerm в MacOS.

Мы используем corda-3.2 с открытым исходным кодом (net.corda:corda-3.2:...) для этой конкретной сборки. Проблема возникает и с открытым исходным кодом 3.3, и Java-версия Oracle "1.8.0_171" на Ubuntu, Java-версия Oracle "1.8.0_152" на Mac.

Когда я пытаюсь выполнить его в окне Linux, я получаю следующую ошибку

Caused by: java.lang.ClassCastException: sun.nio.fs.UnixPath cannot be cast to java.lang.String

как показано в отрывке трассировки стека ниже:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':deploy1Node'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
...
...
Caused by: java.lang.ClassCastException: sun.nio.fs.UnixPath cannot be cast to java.lang.String
        at net.corda.nodeapi.internal.network.NetworkBootstrapper.generateWhitelist(NetworkBootstrapper.kt:323)
        at net.corda.nodeapi.internal.network.NetworkBootstrapper.bootstrap(NetworkBootstrapper.kt:85)
        at net.corda.plugins.Baseform.bootstrapNetwork(Baseform.kt:160)
        at net.corda.plugins.Cordform.build(Cordform.kt:66)
...
...

Как заставить эту задачу работать независимо от платформы?

версия jar с открытым исходным кодом:

Corda-Revision: 5ae8325980ad22df8146b983afeaca344fc03c3e
Corda-Vendor: Corda Open Source
Corda-Release-Version: 3.2-corda

Корпоративная версия в порядке:

Corda-Revision: c9b23a4400923a5cfe88271ce2fedd75740eac40
Corda-Vendor: Corda Enterprise Edition
Corda-Release-Version: 3.1

Пытаясь отследить эту проблему, я обнаружил, что в корпоративной версии отображается в сборке Gradle:

> Task :deploy1Node
Putting task artifact state for task ':deploy1Node' into context took 0.0 secs.
Executing task ':deploy1Node' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
Running Cordform task
Deleting ./build/nodes
Bootstrapping local test network in /mnt/builds/Cordapp/appname/build/nodes
Generating node directory for Node
Copying CorDapp JARs into node directories

и в версии с открытым исходным кодом, вывод:

> Task :deploy1Node
Putting task artifact state for task ':deploy1Node' into context took 0.0 secs.
Executing task ':deploy1Node' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
Running Cordform task
Deleting ./build/nodes
Bootstrapping local network in /mnt/builds/Cordapp/appname/build/nodes
Node config files found in the root directory - generating node directories
Generating directory for Node_node
Nodes found in the following sub-directories: [Node_node]

Кажется, _node добавляется туда, куда не следует.

На русском сайте есть еще одно упоминание об этой проблеме: http://qaru.site/questions/16922067/why-does-my-deploy1node-task-fails-complaining-about-javalangclasscastexception-sunniofsunixpath-cannot-be-cast-to-javalangstring

1 Ответ

0 голосов
/ 21 февраля 2019

Чтобы избежать этой проблемы, убедитесь, что ваши ext.corda_release_group, ext.corda_release_version и ext.corda_gradle_plugins_version определены один раз и только один раз в любом сеансе buildscript вашегоу проекта есть.

Проблема была вызвана попыткой заставить build.gradle выбирать между 2 различными дистрибутивами Corda (с открытым исходным кодом и корпоративным) - и перейти с по умолчанию Выбор после того, как он был впервые использован.Для open source секция build.gradle buildscript должна иметь следующие настройки:

buildscript {
...
            ext.corda_release_group = 'net.corda'
            ext.corda_release_version = '3.2-corda'
            ext.corda_gradle_plugins_version = '3.0.9'
            ext.kotlin_version = '1.2.50'
...

аналогично, для корпоративной версии параметры должны быть такими:

buildscript {
...
            ext.corda_release_group = 'com.r3.corda'
            ext.corda_release_version = '3.1'
            ext.corda_gradle_plugins_version = '4.0.25'
            ext.kotlin_version = '1.2.50'
...

После выбора ссылки запутались, и в версии с открытым исходным кодом не удалось выполнить задачу deploy1Node.

Одна из возможностей - использовать что-то вроде:

buildscript {
   ...
   ext.profile_name = "open-source"
    switch(profile_name) {
        case ~/enterprise/ :
            ext.cdb_node_location = 'nodes-enterprise'
            ext.corda_release_group = 'com.r3.corda'
            ext.corda_release_version = '3.1'
            ext.corda_gradle_plugins_version = '4.0.25'
            ext.kotlin_version = '1.2.50'
            break;
        case ~/open-source/ :
            ext.cdb_node_location = 'nodes'
            ext.corda_release_group = 'net.corda'
            ext.corda_release_version = '3.2-corda'
            ext.corda_gradle_plugins_version = '3.0.9'
            ext.kotlin_version = '1.2.50'
            break;
        default :
            ext.cdb_node_location = 'nodes'
            ext.corda_release_group = 'net.corda'
            ext.corda_release_version = '3.2-corda'
            ext.corda_gradle_plugins_version = '3.0.9'
            ext.kotlin_version = '1.2.50'
            break;
        break;
    }
...