gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:26:20 25 4
gpt4 key购买 nike

我有一个项目,其中有一些 Android 特定代码和桌面特定代码。由于 Java 没有像 #ifdef 这样的东西,我将操作系统特定的代码放在它自己的目录中。像这样的东西

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 用户邮件列表上有一个帖子几乎询问了这个确切的问题,但没有给出解决方案。

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

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< 的文件夹列表/em> 或接口(interface) 定义。

要么

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'])

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

关于java - 使用 SCons 从两个目录构建 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com