使用 SCons 从两个目录构建 Java 类

building Java classes from two directories using SCons

我有一个项目,其中包含一些 android 特定代码和桌面特定代码。由于 Java 没有类似 #ifdef 的东西,我将 os 特定代码放在它自己的目录中。像这样

project
+-- common
|   +-- src
|       +-- com
|           +-- example
|               +-- common1.java
|               +-- common2.java
+-- desktop
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java
+-- android
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java

根据为桌面代码构建代码的平台,或者 android 包含在构建中。

但是我在使用 SCons 构建它时遇到了困难

来自 SCons 构建脚本的示例片段

#target contains the platform we are building on
if target in ['windows', 'linux']:
    java_class_out = env.Java(target='classes', source=['desktop/src', 'common/src'])
    jar_out = env.Jar(target='myOutput.jar', source=java_class_out);

当 运行 时,这将类似于以下内容:

javac -d classes -sourcepath common/src common/src/com/example/common1.java common/src/com/example/common2.java
javac -d classes -sourcepath desktop/src desktop/src/com/example/platform.java
desktop/src/com/example/platform.java:42: error: cannot find symbol

平台中来自 common1.javacommon2.java

的每个符号都重复找不到符号错误

我试图传入所有 java 文件的数组:
更新了 SCons 构建脚本的片段。

#target contains the platform we are building on
if target in ['windows', 'linux']:
    java_files = ['desktop/src/com/example/platform.java',
                  'common/src/com/example/common1.java',
                  'common/src/com/example/common2.java']
    java_class_out = env.Java(target='classes', source=java_files)
    jar_out = env.Jar(target='myOutput.jar', source=java_class_out);

这会产生类似这样的输出:

javac -d classes -sourcepath common/src/com/example common/src/com/example/common1.java
javac -d classes -sourcepath common/src/com/example common/src/com/example/common2.java
javac -d classes -sourcepath desktop/src desktop/src/com/example/platform.java
desktop/src/com/example/platform.java:42: error: cannot find symbol

我想让 SCons 做的是输出类似这样的东西:

javac -d classes -sourcepath common/src -sourcepath desktop/src common/src/com/example/common1.java common/src/com/example/common2.java desktop/src/com/example/platform.java

Scons-users 邮件列表上有一个线程询问 almos这个确切的问题,但没有给出解决方案。

我可以通过 google:

找到的完整电子邮件链

https://pairlist4.pair.net/pipermail/scons-users/2016-February/004609.html

有人知道如何让 Scons 做我需要的吗?不幸的是,我坚持使用 SCons 进行构建。

SCons 足够聪明,可以将调用 Java() 方法的源文件夹作为默认参数添加到 -sourcepath 选项。但是如果你简单地说

env.Java(target='classes', source=['desktop/src', 'common/src'])

这将在内部导致两个单独的调用,具有以下效果:

env.Java(target='classes', source=['desktop/src'])
env.Java(target='classes', source=['common/src'])

。这就是为什么你的方法总是只有一条路,而不是另一条路。

相反,您必须使用提供的 JAVASOURCEPATH 变量(请搜索我们的 User Guide,只有一次出现)来指定应搜索的文件夹列表 class接口定义。

两者都

env.Append(JAVASOURCEPATH=['desktop/src', 'common/src'])
env.Java(target='classes', source=['desktop/src', 'common/src'])

env.Java('classes', 'desktop/src', JAVASOURCEPATH=['common/src'])
env.Java('classes', 'common/src', JAVASOURCEPATH=['desktop/src'])

应该可以解决问题。请注意,为了简洁起见,我在最后一个代码片段中省略了 source/target 说明符,但显式命名参数也应该有效。