【发布时间】:2019-11-30 13:45:45
【问题描述】:
我的目标
我正在尝试用scons 替换ant 来构建java 文件并创建jar 文件。
问题
-
预期结果:以下代码
env.Java(target = 'classes', source = 'src')将生成所有.class文件,然后,当启动干净的构建(未进行任何更改)时,scons 应该告诉我我的 tartet 已启动-迄今为止 -
实际结果:因为
package-info.java文件是空的,sconsjava builder 没有生成 .class 文件。副作用是每次我启动构建时,scons 告诉我他需要生成package-info.class,然后每次都重新启动构建。目标永远不会被认为是最新的。
到目前为止我所做的尝试:
这个问题has been asked很久以前了。但是,该解决方案不再起作用,它试图做的是从目标中删除 package-info.class :
tgts = env.Java(target = 'classes', source = 'src')
for f in tgts:
if f.path.endswith('package-info.class'):
tgts.remove(f)
jar = env.Jar(target = 'dds-interface.jar', source = tgts)
Default(jar)
这会产生错误
AttributeError: <class 'SCons.Node.FS.File'> object has no attribute 'upper':
File "C:\SVN\products\faa_mx\vs2017.install2\SConstruct", line 31:
sc_manager.build()
File "C:\SVN\products\faa_mx\vs2017.install2\cm\env\scons\utilities\sconscriptManager.py", line 43:
cache = SCons.Script.SConscript(str(script).strip(), exports='envService parentEnv vcxprojList', variant_dir=utils.createVariantDir(envService, script), duplicate=0)
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Script\SConscript.py", line 614:
return method(*args, **kw)
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Script\SConscript.py", line 551:
return _SConscript(self.fs, *files, **subst_kw)
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Script\SConscript.py", line 256:
call_stack[-1].globals)
File "C:\SVN\products\faa_mx\vs2017.install2\fwk\network\dds\simd\java\api\java_api.sc", line 51:
source = tgts)
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Environment.py", line 224:
return self.method(*nargs, **kwargs)
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Tool\jar.py", line 169:
target_classes.extend(file_to_class(s))
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Tool\jar.py", line 143:
if(str(_my_normcase(s)).endswith(java_suffix)):
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Node\FS.py", line 366:
return x.upper()
File "c:\python\python35\lib\site-packages\scons-3.0.1\SCons\Node\FS.py", line 632:
(self.__class__, attr))
从我读到的文档中,Jar 只接受 java 文件或“类”作为 来源。
问题:
- 是否可以告诉 scons 强制生成
package-info.class文件(如ant)? - 是否可以直接从项目中删除
package-info.java文件而不破坏所有内容?我不认为文档对我们的项目很重要。
编辑
我找到了解决方案,我应该将-Xpkginfo:always 传递给 scons JAVACFLAGS。不幸的是,当我传递这个参数时,我的 javac (1.7.0_25) 版本崩溃了。
【问题讨论】:
-
选择 scons 而不是传统的 java 工具(如 maven、gradle 或您以前使用的 ant)有什么特别的原因吗?
-
@CoderinoJavarino 95% 的代码是
c++。在过去的几年中,我们进行了从make到scons的相当大的构建系统迁移。我们的java代码始终是通过ant构建的,即使在make年期间也是如此。Make只是在调用ant(今天的scons也是如此)。我想使用scons的原因是我想要一个统一的构建系统。这将使我们的脚本更好更简洁。 -
你能用
--debug=stacktrace再次运行并发布堆栈跟踪吗? -
@bdbaddog 添加了跟踪。顺便说一句,是不是相当于把
package-info.class文件从项目中删除了? -
你使用的是 SCons 3.0.1,你可以试试 3.1.1 吗?