小编swp*_*mer的帖子

jaxb-impl 和 jaxb-runtime 之间有什么区别?

显然,com.sun.xml.bind:jaxb-impl 工件在 Maven 存储库中被标记为“JAXB 运行时模块”(请参阅​​下面的链接),但这两个工件仍在发布新版本:

https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl

这个答案在我的 Maven 项目中,哪些工件应该用于 JAXB RI? 没有阐明差异。

上述问题和这一问题的公认答案如何解决 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 的结论是,对于 Java 9+,您应该使用: org.glassfish.jaxb:jaxb-runtime

但我有使用 com.sun.xml.bind:jaxb-impl 的代码,它似乎工作正常。那么,迁移到 jaxb-runtime 会带来什么损失或收益呢?

即使是最新版本(我撰写本文时为 3.0.2)也可用于“旧”jaxb-impl 模块。如果 Oracle 不再这样做,那么谁制作了 com.sun.xml.bind:jaxb-impl 工件?它是做什么用的?为什么它不与 jaxb-runtime 共享 Maven 组坐标?

是否有任何中心位置可以清楚地记录 JAXB 的当前状况?

现在 JAXB 存在很多混乱。

PS 我暂时需要保持与 Java 8 的兼容性 - 所以我还不能使用 3.x,而 2.4.x 似乎是一次放弃的尝试,旨在修复他们在分离出来时愚蠢地破坏的模块化性。 JDK。

java jaxb

30
推荐指数
1
解决办法
2万
查看次数

我有一个返回0或1的Java方法.我可以让它返回一个布尔值而不生成分支指令吗?

在字节代码级别,Java布尔值表示为0或1.我有一个表达式,结果为0或1,但它是使用int类型计算的.一个简单的例子是:

public static int isOdd_A(int value) {
    return value & 1;
}

public static boolean isOdd_B(int value) {
    return (value & 1) == 1;
}
Run Code Online (Sandbox Code Playgroud)

上述方法的字节代码如下所示:

  public static int isOdd_A(int);
    descriptor: (I)I
    Code:
       0: iload_0
       1: iconst_1
       2: iand
       3: ireturn

  public static boolean isOdd_B(int);
    descriptor: (I)Z
    Code:
       0: iload_0
       1: iconst_1
       2: iand
       3: iconst_1
       4: if_icmpne     11
       7: iconst_1
       8: goto          12
      11: iconst_0
      12: ireturn
Run Code Online (Sandbox Code Playgroud)

返回布尔值的方法要大得多,并且包含一个分支,因此如果运行的机器代码是等效的,则它不是最佳的.

HotSpot JVM是否知道布尔版本可以优化为无网格机器代码?有没有办法欺骗Java使用基于int的字节代码来返回一个布尔值的方法(例如使用ASM)?

编辑:许多人认为这不值得担心,总的来说我同意.但是我确实创建了这个微基准测试并用jmh运行它,并注意到int版本大约10%的改进:

@Benchmark
public int countOddA() {
    int odds = …
Run Code Online (Sandbox Code Playgroud)

java jit bytecode

6
推荐指数
1
解决办法
702
查看次数

您如何在Java 11中调用schemagen?

根据Oracle文档,schemagen工具已作为JEP 320(http://openjdk.java.net/jeps/320)的一部分从JDK中删除。JEP指出了现在提供缺少工具的Maven工件。在JEP中,工件的坐标是错误的,可以在以下问题的答案中找到更新的坐标: 我的Maven项目中应为JAXB RI使用哪些工件?

但是缺少的是如何调用工具。JEP中指向的Shell脚本位于JAXB-RI Git存储库中。但是,这些脚本仍然没有文档记录,很难调用。该git repo中的构建说明指示它是使用标准的“ mvn全新安装”构建的,但是不会产生与此处文档中使用的“ bin”文件夹相匹配的输出结构:https : //javaee.github.io /jaxb-v2/doc/user-guide/ch04.html#tools-schemagen

理想情况下,我想从Gradle运行schemagen,避免使用shell脚本,因为它们不是从maven依赖项获得的。

我当前的尝试是从一个称为旧schemagen.exe的工作版本改编而成,看起来像这样:

(“真实” build.gradle文件中还有更多内容可以指定我的应用程序的依赖关系,等等。)

configurations {
  schemagenTool
}
dependencies {
  schemagenTool "org.glassfish.jaxb:jaxb-jxc:${jaxbVersion}"
}
task schemaGen(type: Exec, dependsOn: [compileJava,configurations.schemaGenTool]) {
  workingDir projectDir
  executable 'java'

  doFirst {
    file('build/Schemas').mkdirs()
    args '--module-path', "${configurations.schemaGenTool.asPath}",
         '-m', 'jaxb.jxc/com.sun.tools.jxc.SchemaGeneratorFacade',
         // Note: automatic module name is NOT com.sun.tool.jxc
         // as documented
         // Args to schemagen (these worked for the schemagen.exe)
         '-d', 'build/Schemas',
         '-classpath', "${compileJava.destinationDir}${File.pathSeparator}${configurations.compile.asPath}",
         "src/main/java/path/to/my/ModelClass.java"
         //println "\nschemagen: ${args.join(' ')}\n"
  }

  doLast {
    // Above …
Run Code Online (Sandbox Code Playgroud)

java jaxb2 gradle schemagen java-11

5
推荐指数
1
解决办法
1620
查看次数

是否可以在JDK 11上使用jlink来创建包含已删除的Java SE EE模块的运行时?

当我尝试在运行时包含java.xml.bind时,我收到一条错误消息:

错误:自动模块不能与jlink一起使用:java.activation from file:... [url to javax.activation-api-1.2.0.jar in my gradle cache]

我在模块路径上使用这些工件:

"javax.xml.bind:jaxb-api:2.4.0"
"org.glassfish.jaxb:jaxb-runtime:2.4.0-b180830.0438"
Run Code Online (Sandbox Code Playgroud)

看来,使用JDK 11,模块已被删除,但尚未提供完全模块化的替换.所以jlink无法从它们创建运行时.

为什么外部替换不是正确的模块化,因为它们已经是JDK 10中的模块?

java.activation不仅没有模块化,它还有一个新的模块名称"jakarta.activation".请参阅https://eclipse-ee4j.github.io/jaf/#Latest_News 我相信会进一步破坏事情,因为依赖于该模块的所有内容都必须在jlink运行之前再次更改.

java jlink

5
推荐指数
0
解决办法
316
查看次数

标签 统计

java ×4

bytecode ×1

gradle ×1

java-11 ×1

jaxb ×1

jaxb2 ×1

jit ×1

jlink ×1

schemagen ×1