Service Fabric Java 二进制文件已从 Service Fabric Java SDK 移至 Maven 托管。 你可以使用 mavencentral 来提取最新的 Service Fabric Java 依赖项。 本指南将帮助你更新使用 Yeoman 模板或 Eclipse 为 Service Fabric Java SDK 创建的现有 Java 应用程序,使其与基于 Maven 的内部版本兼容。
首先,卸载现有的 Java SDK。
sudo dpkg -r servicefabricsdkjava
按照此处提到的步骤安装最新的 Service Fabric CLI。
若要生成和使用 Service Fabric Java 应用程序,请确保已安装 JDK 1.8 和 Gradle。 如果尚未安装,可运行以下命令来安装 JDK 1.8 (openjdk-8-jdk) 和 Gradle:
sudo apt-get install openjdk-8-jdk-headless sudo apt-get install gradle
按照此处提到的步骤,更新应用程序的安装/卸载脚本,以便使用新的 Service Fabric CLI。 可以参考入门示例。
提示
卸载 Service Fabric Java SDK 后,Yeoman 将无法使用。 请遵循此处提到的先决条件,以便启动和运行 Service Fabric Yeoman Java 模板生成器。
Service Fabric Java 库已托管在 Maven 中。 可以在项目的 pom.xml
或 build.gradle
中添加依赖项,以便使用 mavenCentral 提供的 Service Fabric Java 库。
针对应用程序的 Service Fabric Reliable Actor 支持。
<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'
}
针对应用程序的 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'
}
针对 Service Fabric Java 应用程序的传输层支持。 不需向 Reliable Actor 或 Service 应用程序显式添加此依赖项,除非在传输层编程。
<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'
}
针对 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'
}
若要使用从 Maven 提取的 Service Fabric 依赖项生成现有的 Service Fabric 无状态 Java 服务,需更新该服务中的 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('*')
}
}
通常情况下,若要粗略地了解 Service Fabric 无状态 Java 服务的生成脚本的情况,可参阅入门示例中提供的任何示例。 这里是适用于 EchoServer 示例的 build.gradle。
若要使用从 Maven 提取的 Service Fabric 依赖项生成现有的 Service Fabric Actor Java 应用程序,需更新接口包和服务包中的 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')
}
}