【问题标题】:scons and java, how deal with package-info.javascons和java,如何处理package-info.java
【发布时间】:2019-11-30 13:45:45
【问题描述】:

我的目标

我正在尝试用scons 替换ant 来构建java 文件并创建jar 文件。

问题

  1. 预期结果:以下代码 env.Java(target = 'classes', source = 'src') 将生成所有 .class 文件,然后,当启动干净的构建(未进行任何更改)时,scons 应该告诉我我的 tartet 已启动-迄今为止
  2. 实际结果:因为package-info.java 文件是空的,scons java 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 文件或“类”作为 来源。

问题:

  1. 是否可以告诉 scons 强制生成package-info.class 文件(如ant)?
  2. 是否可以直接从项目中删除package-info.java 文件而不破坏所有内容?我不认为文档对我们的项目很重要。

编辑

我找到了解决方案,我应该将-Xpkginfo:always 传递给 scons JAVACFLAGS。不幸的是,当我传递这个参数时,我的 javac (1.7.0_25) 版本崩溃了。

【问题讨论】:

  • 选择 scons 而不是传统的 java 工具(如 maven、gradle 或您以前使用的 ant)有什么特别的原因吗?
  • @CoderinoJavarino 95% 的代码是c++。在过去的几年中,我们进行了从makescons 的相当大的构建系统迁移。我们的java 代码始终是通过ant 构建的,即使在make 年期间也是如此。 Make 只是在调用 ant(今天的 scons 也是如此)。我想使用scons 的原因是我想要一个统一的构建系统。这将使我们的脚本更好更简洁。
  • 你能用--debug=stacktrace再次运行并发布堆栈跟踪吗?
  • @bdbaddog 添加了跟踪。顺便说一句,是不是相当于把package-info.class文件从项目中删除了?
  • 你使用的是 SCons 3.0.1,你可以试试 3.1.1 吗?

标签: java ant scons


【解决方案1】:

最后,很简单,javac 编译器有一个参数来强制生成package-info.class

只需将-Xpkginfo:always 传递给scons JAVACFLAGS。不幸的是,当我传递这个参数时,我的 javac (1.7.0_25) 版本崩溃了。 javac 1.8 可以很好地处理这个参数。

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 2012-10-06
    • 2012-05-04
    • 2011-10-09
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多