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

时间:2016-02-12 16:34:13

标签: j2objc-gradle

我使用Gradle J2ObjC插件建议的SharedCodeAndroidiOS项目结构... {strong}访问SharedCode中的类等> AndroidiOS模块的主要应用程序代码。这很好。

我想要做的是添加一个名为SharedCodeTestContracts的第四个模块,该模块依赖于SharedCode,其类等将由测试代码访问AndroidiOS模块而不是应用程序代码,如下所示:

Module dependencies

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

关于原因的一些上下文:偶尔我在SharedCode模块中定义一个接口,该接口将在AndroidiOS模块中单独实现。为了避免两次写入相同的测试(每个平台上一次),我希望将测试放在共享的地方,每个模块都可以访问。

2 个答案:

答案 0 :(得分:1)

这是一个起点。

我假设你已经有了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.此外,当你说A链接到B时你的意思是B链接在A.我在澄清,因为这两者通常是相反的。

当您构建所有Gradle项目时,您将获得2个J2ObjC静态库,一个用于SharedCode,另一个用于SharedCodeTestContracts。在您的iOS Xcode项目中,将应用程序目标链接到SharedCode .a文件,并将测试目标链接到SharedCode和SharedCodeTestContracts。

答案 1 :(得分:0)

感谢@ advayDev1指出我正确的方向。

解决方案是声明build.gradle模块的SharedCode文件,如下所示:

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()
}

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

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了解更多信息。