使用SCON从两个目录构建Java类
我有一个项目,有一些android特定的代码和桌面特定的代码。因为Java没有类似于#ifdef的东西,所以我将特定于操作系统的代码放在它自己的目录中。像这样的使用SCON从两个目录构建Java类,java,build,scons,Java,Build,Scons,我有一个项目,有一些android特定的代码和桌面特定的代码。因为Java没有类似于#ifdef的东西,所以我将特定于操作系统的代码放在它自己的目录中。像这样的 project +-- common | +-- src | +-- com | +-- example | +-- common1.java | +-- common2.java +-- desktop | +-- src |
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'])
或
我们应该做到这一点。请注意,为了简洁起见,我在上一个代码片段中省略了源/目标说明符,但显式命名参数也应该起作用。谢谢。这对我帮助很大。像大多数问题一样,这只是一件你没有意识到的小事。