Обновите предыдущее приложение Java Service Fabric, чтобы получить библиотеки Java из Maven

Двоичные файлы Java для Service Fabric теперь размещаются на платформе Maven, а не в SDK для Java. Вы можете использовать mavencentral для получения последних зависимостей Java Service Fabric. Это руководство поможет вам обновить существующие приложения Java, созданные для пакета SDK для Java Service Fabric, с помощью шаблона Yeoman или Eclipse, совместимых с сборкой на основе Maven.

Необходимые условия

  1. Сначала удалите существующий пакет SDK для Java.

    sudo dpkg -r servicefabricsdkjava
    
  2. Установите последнюю версию интерфейса командной строки Service Fabric, выполнив описанные здесь действия.

  3. Чтобы создать и работать с приложениями Java Service Fabric, убедитесь, что установлен JDK 1.8 и Gradle. Если еще не установлено, можно выполнить следующее, чтобы установить JDK 1.8 (openjdk-8-jdk) и Gradle —

    sudo apt-get install openjdk-8-jdk-headless
    sudo apt-get install gradle
    
  4. Обновите скрипты установки и удаления приложения, чтобы использовать новый интерфейс командной строки Service Fabric, выполнив описанные здесь действия. Вы можете ознакомиться с нашими примерами начала работы.

Подсказка

После удаления пакета SDK Java для Service Fabric Yeoman не будет работать. Следуйте предварительным требованиям, указанным здесь, чтобы генератор шаблонов Yeoman для Service Fabric работал корректно.

Библиотеки Java Service Fabric в Maven

Библиотеки Java Service Fabric размещены в Maven. Вы можете добавить зависимости в pom.xml или build.gradle вашего проекта, чтобы использовать библиотеки Java Service Fabric из mavenCentral.

Actors

Поддержка надежных субъектов Service Fabric для приложения.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-actors</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-actors:1.0.0'
}

Services

Поддержка службы без отслеживания состояния Service Fabric для приложения.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-services</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-services:1.0.0'
}

Прочее

Транспорт

Поддержка уровня транспорта для приложения Java Service Fabric. Не нужно явно добавлять эту зависимость в приложения Надежного Актора или службы, если вы не программируете на уровне транспорта.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf-transport</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf-transport:1.0.0'
}

Поддержка Fabric

Поддержка системного уровня для Service Fabric, которая взаимодействует с родной средой выполнения Service Fabric. Вам не нужно явно добавлять эту зависимость в приложения Reliable Actor или Service. Эта зависимость автоматически загружается из Maven при включении других зависимостей, приведенных выше.

<dependency>
    <groupId>com.microsoft.servicefabric</groupId>
    <artifactId>sf</artifactId>
    <version>1.0.0</version>
</dependency>
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.microsoft.servicefabric:sf:1.0.0'
}

Миграция стейтлесс-службы Service Fabric

Чтобы иметь возможность создать существующую бессостояточную Java-службу Service Fabric с использованием зависимостей Service Fabric, загруженных из Maven, необходимо обновить файл build.gradle в этой службе. Ранее он использовался, как показано ниже -

dependencies {
    compile fileTree(dir: '/opt/microsoft/sdk/servicefabric/java/packages/lib', include: ['*.jar'])
    compile project(':Interface')
}
.
.
.
jar {
    manifest {
    attributes(
                'Main-Class': 'statelessservice.MyStatelessServiceHost',
                "Class-Path": configurations.compile.collect { 'lib/' + it.getName() }.join(' '))
    baseName "MyStateless"
    destinationDir = file('./../MyStatelessApplication/MyStatelessPkg/Code')
}
.
.
.
task copyDeps <<{
    copy {
        from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
        into("./../MyStatelessApplication/MyStatelessPkg/Code/lib")
        include('*.jar')
    }
    copy {
        from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
        into("./../MyStatelessApplication/MyStatelessPkg/Code/lib")
        include('libj*.so')
    }
}

Теперь, чтобы получить зависимости от Maven, обновлениеbuild.gradle будет содержать соответствующие части следующим образом.

repositories {
        mavenCentral()
}

configurations {
    azuresf
}

dependencies {
    compile project(':Interface')
    azuresf ('com.microsoft.servicefabric:sf-services:1.0.0')
    compile fileTree(dir: 'lib', include: '*.jar')
}

task explodeDeps(type: Copy, dependsOn:configurations.azuresf) { task ->
    configurations.azuresf.filter { it.toString().contains("native") }.each{
        from zipTree(it)
    }
    configurations.azuresf.filter { !it.toString().contains("native") }.each {
        from it
    }
    into "lib"
    include "libj*.so", "*.jar"
}

compileJava.dependsOn(explodeDeps)
.
.
.
jar {
    manifest {
        def mpath = configurations.compile.collect {'lib/'+it.getName()}.join (' ')
        mpath = mpath + ' ' + configurations.azuresf.collect {'lib/'+it.getName()}.join (' ')
        attributes(
                'Main-Class': 'statelessservice.MyStatelessServiceHost',
                "Class-Path": mpath)
    baseName "MyStateless"
    destinationDir = file('./../MyStatelessApplication/MyStatelessPkg/Code')
   }
}
.
.
.
task copyDeps <<{
    copy {
        from("lib/")
        into("./../MyStatelessApplication/MyStatelessPkg/Code/lib")
        include('*')
    }
}

Как правило, чтобы получить общее представление о том, как скрипт сборки будет выглядеть для службы Java без отслеживания состояния Service Fabric, можно обратиться к любому примеру из наших примеров начала работы. Ниже приведен пример build.gradle для примера EchoServer.

Перенос актёрной службы Service Fabric

Чтобы можно было создать ваше существующее приложение Java Actor Service Fabric, используя зависимости Service Fabric, загруженные из Maven, необходимо обновить файл build.gradle внутри пакета интерфейса и в пакете службы. Если у вас есть пакет TestClient, необходимо также обновить его. Таким образом, для вашего актера Myactor необходимо обновить следующие компоненты -

./Myactor/build.gradle
./MyactorInterface/build.gradle
./MyactorTestClient/build.gradle

Обновление скрипта сборки для проекта интерфейса

Ранее он использовался, как показано ниже -

dependencies {
    compile fileTree(dir: '/opt/microsoft/sdk/servicefabric/java/packages/lib', include: ['*.jar'])
}
.
.

Теперь, чтобы получить зависимости от Maven, обновленоbuild.gradle будет иметь соответствующие части, как показано ниже.

repositories {
    mavenCentral()
}

configurations {
    azuresf
}

dependencies {
    azuresf ('com.microsoft.servicefabric:sf-actors:1.0.0')
    compile fileTree(dir: 'lib', include: '*.jar')
}

task explodeDeps(type: Copy, dependsOn:configurations.azuresf) { task ->
    configurations.azuresf.filter { it.toString().contains("native") }.each{
        from zipTree(it)
    }
    configurations.azuresf.filter { !it.toString().contains("native") }.each {
        from it
    }
    into "lib"
    include "libj*.so", "*.jar"
}

compileJava.dependsOn(explodeDeps)
.
.

Обновление скрипта сборки для проекта актора

Ранее он использовался, как показано ниже -

dependencies {
    compile fileTree(dir: '/opt/microsoft/sdk/servicefabric/java/packages/lib', include: ['*.jar'])
    compile project(':MyactorInterface')
}
.
.
.
jar {
    manifest {
    attributes(
                'Main-Class': 'reliableactor.MyactorHost',
                "Class-Path": configurations.compile.collect { 'lib/' + it.getName() }.join(' '))
      baseName "myactor"
    destinationDir = file('./../myjavaapp/MyactorPkg/Code')
    }
}
.
.
.
task copyDeps<< {
    copy {
        from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
        into("./../myjavaapp/MyactorPkg/Code/lib")
        include('*.jar')
    }
    copy {
        from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
        into("./../myjavaapp/MyactorPkg/Code/lib")
        include('libj*.so')
    }
    copy {
        from("../MyactorInterface/out/lib")
        into("./../myjavaapp/MyactorPkg/Code/lib")
        include('*.jar')
    }
}

Теперь, чтобы получить зависимости от Maven, обновлениеbuild.gradle будет содержать следующие соответствующие части.

repositories {
    mavenCentral()
}

configurations {
    azuresf
}

dependencies {
    compile project(':MyactorInterface')
    azuresf ('com.microsoft.servicefabric:sf-actors:1.0.0')
    compile fileTree(dir: 'lib', include: '*.jar')
}

task explodeDeps(type: Copy, dependsOn:configurations.azuresf) { task ->
    configurations.azuresf.filter { it.toString().contains("native") }.each{
        from zipTree(it)
    }
    configurations.azuresf.filter { !it.toString().contains("native") }.each {
        from it
    }
    into "lib"
    include "libj*.so", "*.jar"
}

compileJava.dependsOn(explodeDeps)
.
.
.
jar {
    manifest {
        def mpath = configurations.compile.collect {'lib/'+it.getName()}.join (' ')
        mpath = mpath + ' ' + configurations.azuresf.collect {'lib/'+it.getName()}.join (' ')
        attributes(
                'Main-Class': 'reliableactor.MyactorHost',
                "Class-Path": mpath)
    baseName "myactor"
    destinationDir = file('../myjavaapp/MyactorPkg/Code')}
 }
.
.
.
task copyDeps<< {
      copy {
              from("lib/")
              into("../myjavaapp/MyactorPkg/Code/lib")
              include('*')
      }
      copy {
              from("../MyactorInterface/out/lib")
              into("../myjavaapp/MyactorPkg/Code/lib")
              include('*.jar')
      }
}

Обновление скрипта сборки для тестового клиентского проекта

Здесь изменения похожи на изменения, обсуждаемые в предыдущем разделе, то есть проект актера. Ранее скрипт Gradle использовался следующим образом:

dependencies {
    compile fileTree(dir: '/opt/microsoft/sdk/servicefabric/java/packages/lib', include: ['*.jar'])
    compile project(':MyactorInterface')
}
.
.
.
jar
{
    manifest {
    attributes(
        'Main-Class': 'reliableactor.test.MyactorTestClient',
        "Class-Path": configurations.compile.collect { 'lib/' + it.getName() }.join(' '))
    }
    baseName "myactor-test"
    destinationDir = file('out/lib')
}
.
.
.
task copyDeps<< {
        copy {
                from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
                into("./out/lib/lib")
                include('*.jar')
        }
        copy {
                from("/opt/microsoft/sdk/servicefabric/java/packages/lib")
                into("./out/lib/lib")
                include('libj*.so')
        }
        copy {
                from("../MyactorInterface/out/lib")
                into("./out/lib/lib")
                include('*.jar')
        }
}

Теперь, чтобы получить зависимости от Maven, обновлениеbuild.gradle включает соответствующие части, как показано ниже.

repositories {
    mavenCentral()
}

configurations {
    azuresf
}

dependencies {
    compile project(':MyactorInterface')
    azuresf ('com.microsoft.servicefabric:sf-actors:1.0.0')
    compile fileTree(dir: 'lib', include: '*.jar')
}

task explodeDeps(type: Copy, dependsOn:configurations.azuresf) { task ->
    configurations.azuresf.filter { it.toString().contains("native") }.each{
        from zipTree(it)
    }
    configurations.azuresf.filter { !it.toString().contains("native") }.each {
        from it
    }
    into "lib"
    include "libj*.so", "*.jar"
}

compileJava.dependsOn(explodeDeps)
.
.
.
jar
{
    manifest {
        def mpath = configurations.compile.collect {'lib/'+it.getName()}.join (' ')
        mpath = mpath + ' ' + configurations.azuresf.collect {'lib/'+it.getName()}.join (' ')
    attributes(
                'Main-Class': 'reliableactor.test.MyactorTestClient',
                "Class-Path": mpath)
    baseName "myactor-test"
    destinationDir = file('./out/lib')
        }
}
.
.
.
task copyDeps<< {
        copy {
                from("lib/")
                into("./out/lib/lib")
                include('*')
        }
        copy {
                from("../MyactorInterface/out/lib")
                into("./out/lib/lib")
                include('*.jar')
        }
}

Дальнейшие действия