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

使用SCON从两个目录构建Java类,java,build,scons,Java,Build,Scons,我有一个项目,有一些android特定的代码和桌面特定的代码。因为Java没有类似于#ifdef的东西,所以我将特定于操作系统的代码放在它自己的目录中。像这样的 project +-- common | +-- src | +-- com | +-- example | +-- common1.java | +-- common2.java +-- desktop | +-- src |

我有一个项目,有一些android特定的代码和桌面特定的代码。因为Java没有类似于#ifdef的东西,所以我将特定于操作系统的代码放在它自己的目录中。像这样的

project
+-- common
|   +-- src
|       +-- com
|           +-- example
|               +-- common1.java
|               +-- common2.java
+-- desktop
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java
+-- android
|   +-- src
|       +-- com
|           +-- example
|               +-- platform.java
根据构建的平台,桌面或安卓系统的代码包含在构建中

然而,我很难用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.java
common2.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
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做的是输出类似于以下内容的内容:

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
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用户邮件列表上有一条线索问了几乎完全相同的问题,但没有给出解决方案

我可以通过谷歌找到完整的电子邮件链:

有人知道如何让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
变量(请搜索我们的,只有一次出现)来指定应该搜索类或接口定义的文件夹列表

或者

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


我们应该做到这一点。请注意,为了简洁起见,我在上一个代码片段中省略了源/目标说明符,但显式命名参数也应该起作用。

谢谢。这对我帮助很大。像大多数问题一样,这只是一件你没有意识到的小事。