scala 矩阵向量乘法在stdout中打印java版本

q5lcpyga  于 2022-11-29  发布在  Scala
关注(0)|答案(2)|浏览(121)

Scala上的以下代码输出return java 11 instance
我使用的是openjdk-11和sbt1.8.0。
第一个
出现此输出的原因是什么?如何在使用Breeze的项目中避免出现此输出?
此外,这个问题会在其他版本的jdk中重现,此代码总是打印构建它的java版本。

ycl3bljg

ycl3bljg1#

问题是,对于密集矩阵的乘法,Breeze使用https://github.com/luhenry/netlib和记录器dev.ludovic.netlib.blas.InstanceBuilder
https://github.com/luhenry/netlib/blob/master/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java

private static JavaBLAS initializeJava() {
  String[] fullVersion = System.getProperty("java.version").split("[+.\\-]+", 2);
  int major = Integer.parseInt(fullVersion[0]);
  if (major >= 16) {
    try {
      System.out.println("trying to return java 16 instance");
      return VectorBLAS.getInstance();
    } catch (Throwable t) {
      log.warning("Failed to load implementation from:" + VectorBLAS.class.getName());
    }
  }
  if (major >= 11) {
    System.out.println("return java 11 instance");
    return Java11BLAS.getInstance();
  } else {
    System.out.println("return java 8 instance");
    return Java8BLAS.getInstance();
  }
}

使用setLevel可以关闭所有其他日志记录

import java.util.logging.{Level, Logger}

val logger = Logger.getLogger("dev.ludovic.netlib.blas.InstanceBuilder")

logger.log(Level.SEVERE, "AAAA!!!") // prints

logger.setLevel(Level.OFF)
logger.log(Level.SEVERE, "BBBB!!!") // doesn't print

Is there a way to disable java.util.logging and enable it back later?
Why are the Level.FINE logging messages not showing?
但是return java...消息不是用log/doLog打印的,而是直接用类InstanceBuilder的静态初始化块中的System.out.println打印的,所以这是在类InstanceBuilder的初始化期间执行的。
静态初始化块只能通过字节码操作(Javassist、Byte Buddy)进行修改
Over riding the static block of a class in java
所以最简单的方法就是修改打印流

System.setOut(new java.io.PrintStream(System.out) {
  override def println(s: String): Unit =
    if (Seq("trying to return java", "return java").forall(!s.startsWith(_)))
      super.println(s)
})

https://scastie.scala-lang.org/DmytroMitin/gk52bU4iSEebHAZPZKhaDw/5

7y4bm7vi

7y4bm7vi2#

顺便说一下,这个问题在netlib的最新版本中已经解决了
https://github.com/scalanlp/breeze/issues/849

相关问题