可以在一个项目中有两个 Java 共享代码模块吗?

Possible to have two Java shared code modules in a project?

我有建议的 SharedCodeAndroidiOS 项目结构,使用 Gradle J2ObjC 插件...其中 类 等 SharedCodeAndroidiOS 模块的 main 应用程序代码访问。这很好用。

我想要做的是添加第四个名为 SharedCodeTestContracts 的模块,它依赖于 SharedCode 并且其 类 等将被 test AndroidiOS 模块的代码而不是 main 应用程序代码,如下:

问题: J2ObjC Gradle 插件可以实现这样的功能吗?我可以有两个由 J2ObjC 翻译的模块吗...一个链接到 iOS main 应用程序目标,另一个包含 JUnit 测试和链接到 iOS 仅测试目标?

关于原因的一些上下文: 有时我在 SharedCode 模块中定义一个接口,该接口将在 AndroidiOS 模块。为了避免两次编写相同的测试(在每个平台上一次),我想将测试放在一个共享的地方,每个模块都可以访问它。

这是一个起点。

我假设您此时已经 SharedCode/build.gradle 工作。

在Android/build.gradle:

dependencies {
    compile project(':SharedCode')
    testCompile project(':SharedCodeTestContracts')
}

将 J2objC Gradle 插件应用于 SharedCodeTestContracts/build.gradle,并确保您已指定共享代码的 j2objcLinkage 依赖项:

dependencies {
    compile project(':SharedCode')
    j2objcLinkage project(':SharedCode')
}

假设 1:您的 Ios 模块是一个纯 Xcode ObjC/Swift 项目(不是用 j2objc 编译的 Java Gradle 项目)。如果您的 Ios 模块是一个 Java Gradle 项目,这仍然是可能的,但过程不同。阅读 https://github.com/j2objc-contrib/j2objc-gradle/blob/master/dependencies.md#dependency-configurations,了解您可以使用的各种依赖指令。就像 Gradle Java 有 'compile' 和 'testCompile' 一样,J2objc-Gradle 在其依赖指令上有 'test' 变体。

假设 2:从 A 到 B 的箭头表示 B 在您的绘图中依赖于 A。此外,当您对 B 说 A links 时,您的意思是 A 中的 B links。我要澄清一下,因为这两者通常是相反的。

构建所有 Gradle 项目后,您将获得 2 个 J2ObjC 静态库,一个用于 SharedCode,一个用于 SharedCodeTestContracts。在您的 iOS Xcode 项目中,将应用程序目标 link 仅指向 SharedCode .a 文件,并将测试目标 link 指向 SharedCode 和 SharedCodeTestContracts。

感谢@advayDev1 为我指明了正确的方向。

解决方法是SharedCode模块的build.gradle文件声明如下:

plugins {
    id 'java'
    id 'com.github.j2objccontrib.j2objcgradle' version '0.6.0-alpha'
}

dependencies {
    compile 'com.google.guava:guava:18.0'
    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
}

j2objcConfig {
    autoConfigureDeps true
    minVersionIos '8.4'
    xcodeProjectDir '../iOS'
    xcodeTargetsIos 'MySDK', 'MySDKTests'
    finalConfigure()
}

并声明TestContracts模块的build.gradle文件如下:

plugins {
    id 'java'
    id 'com.github.j2objccontrib.j2objcgradle' version '0.6.0-alpha'
}

dependencies {
    compile project(':SharedCode')
    compile 'junit:junit:4.12' // this is compile scope deliberately
    compile 'org.hamcrest:hamcrest-core:1.3' // this is compile scope deliberately
}

j2objcConfig {
    autoConfigureDeps true
    minVersionIos '8.4'
    xcodeProjectDir '../iOS'
    xcodeTargetsIos 'MySDKTests'
    finalConfigure()
}

基于以上内容,在构建您的项目时,您应该期望 Podfile 的内容如下:

target 'MySDK' do
    platform :ios, '8.4'
    j2objc_SharedCode
    import_other_pods
end

target 'MySDKTests' do
    platform :ios, '8.4'
    j2objc_TestContracts
    j2objc_SharedCode
    import_other_pods
end

J2ObjC Gradle 插件中存在一个错误,它不能完全产生预期的 Podfile 输出,但请参阅 here 了解更多信息。