使用 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.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
我想让 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 说明符,但显式命名参数也应该有效。
我有一个项目,其中包含一些 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.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
我想让 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 说明符,但显式命名参数也应该有效。