小编Zhe*_*lov的帖子

使用Java EE API替换已弃用的JPMS模块

Java 9 弃用了六个包含Java EE API的模块,它们很快被删除:

  • javax.activation包的java.activation
  • java.corbajavax.activity,javax.rmi,javax.rmi.CORBA,和org.omg.*
  • javax.transaction包的java.transaction
  • 包含所有javax.xml.bind.*包的java.xml.bind
  • java.xml.wsjavax.jws,javax.jws.soap,javax.xml.soap,和所有javax.xml.ws.*
  • javax.annotation包的java.xml.ws.annotation

哪些维护的第三方工件提供了这些API?它们提供这些API或它们必须提供的其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?

为了更容易收集知识,我回答了迄今为止我所知道的并将答案作为社区维基.我希望人们能够扩展它,而不是写出自己的答案.


在您投票结束之前:

  • 是的,已经有一些关于单个模块的问题,这个问题的答案当然会复制这些信息.但AFAIK没有任何一点可以了解所有这些,我认为这些有很大的价值.
  • 提出图书馆建议的问题通常被认为是偏离主题的,因为"他们倾向于吸引自以为是的答案和垃圾邮件",但我不认为这适用于此.明确描述了一组有效的库:它们必须实现特定的标准.除此之外别无其他,所以我没有看到很多意见和垃圾邮件的风险.

java java-ee java-9 java-module

150
推荐指数
6
解决办法
5万
查看次数

无法使用Maven编译简单的Java 10/Java 11项目

我有一个简单的Maven项目:

src
??? main
    ??? java
        ??? module-info.java
pom.xml
Run Code Online (Sandbox Code Playgroud)

pom.xml中:

<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <release>10</release>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

当我通过构建项目时mvn -X install -DskipTests=true,它失败了:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project example: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) …
Run Code Online (Sandbox Code Playgroud)

java maven java-10 module-info java-11

111
推荐指数
6
解决办法
8万
查看次数

List.of和Arrays.asList有什么区别?

Java 9为列表引入了一种新的工厂方法List.of:

List<String> strings = List.of("first", "second");
Run Code Online (Sandbox Code Playgroud)

前一个和新选项有什么区别?也就是说,这有什么区别:

Arrays.asList(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

还有这个:

List.of(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

java list java-9

95
推荐指数
5
解决办法
2万
查看次数

Cabal和Stack有什么区别?

昨天我了解了一个名为Stack的新Haskell工具.乍一看,看起来它与Cabal完全相同.那么,它们之间有什么区别?堆叠是Cabal的替代品吗?在哪些情况下我应该使用Stack而不是Cabal?什么可以堆栈做Cabal不能?

haskell cabal haskell-stack

87
推荐指数
3
解决办法
2万
查看次数

Java 9编译器中的--release标志是什么?

Java 9 javac有一个新的标志--release:

> javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9
Run Code Online (Sandbox Code Playgroud)

-source-target旗帜有什么不同?它只是一个捷径-source X -target X吗?

java javac java-9

62
推荐指数
2
解决办法
8162
查看次数

newInstance vs jdk-9/jdk-8和jmh中的new

我在这里看到很多线程比较并尝试回答哪个更快:newInstance或者new operator.

看看源代码,它看起来newInstance应该慢得多,我的意思是它做了很多安全检查并使用反射.而且我决定先测量一下jdk-8.这是使用的代码jmh.

@BenchmarkMode(value = { Mode.AverageTime, Mode.SingleShotTime })
@Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)   
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)    
@State(Scope.Benchmark) 
public class TestNewObject {
    public static void main(String[] args) throws RunnerException {

        Options opt = new OptionsBuilder().include(TestNewObject.class.getSimpleName()).build();
        new Runner(opt).run();
    }

    @Fork(1)
    @Benchmark
    public Something newOperator() {
       return new Something();
    }

    @SuppressWarnings("deprecation")
    @Fork(1)
    @Benchmark
    public Something newInstance() throws InstantiationException, IllegalAccessException {
         return Something.class.newInstance(); …
Run Code Online (Sandbox Code Playgroud)

java performance java-8 jmh java-9

39
推荐指数
1
解决办法
3838
查看次数

为什么 javac 为最终字段插入 Objects.requireNonNull(this) ?

考虑以下类:

class Temp {
    private final int field = 5;

    int sum() {
        return 1 + this.field;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我编译和反编译这个类:

> javac --version
javac 11.0.5

> javac Temp.java

> javap -v Temp.class
  ...
  int sum();
    descriptor: ()I
    flags: (0x0000)
    Code:
      stack=2, locals=1, args_size=1
         0: iconst_1
         1: aload_0
         2: invokestatic  #3   // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
         5: pop
         6: iconst_5
         7: iadd
         8: ireturn
Run Code Online (Sandbox Code Playgroud)

简单来说,javac编译sum()成这样:

int sum() {
    final int n = 1;
    Objects.requireNonNull(this); // <---
    return n + …
Run Code Online (Sandbox Code Playgroud)

java javac java-8 ecj java-11

38
推荐指数
1
解决办法
970
查看次数

为什么Java 9引入了JMOD文件格式?

Java 9有三种方法可以将编译后的代码打包到文件中:

  • JMOD
  • JIMAGE

JIMAGE针对速度和空间进行了优化,并在运行时由JVM使用,因此有理由引入JIMAGE.JIMAGE文件不应发布到maven repos或在编译或链接时使用.

文档声称JMOD可以存储本机代码和JAR文件无法存储的其他内容,开发人员可以制作和分发自己的JMOD文件.JDK附带jmods/包含JDK 所有模块的目录,供用户依赖.

问题:

  • 为什么Java 9引入了JMOD文件格式?
  • 库作者是应该分发JMOD文件还是JAR文件?
  • jmod文件应该发布到maven repos吗?

java java-platform-module-system java-9

33
推荐指数
2
解决办法
8099
查看次数

Eclipse文件搜索多次查找同一文件

在Eclipse中,我有两个maven项目A和B,其中A是B的父项.目录结构如下:

A/pom.xml
A/B/pom.xml
A/B/...
Run Code Online (Sandbox Code Playgroud)

然后我使用文件搜索(Ctrl + H)查找项目B中的任何文件.搜索结果窗口使用不同的相对路径显示文件两次:

A/B/<my_file>
B/<my_file>
Run Code Online (Sandbox Code Playgroud)

因此,同一文件显示两次.显然,第一个搜索结果是reduntant.有没有办法排除这些重复的搜索结果?

eclipse maven

29
推荐指数
4
解决办法
7872
查看次数

我该如何命名我的Java 9模块?

假设我有一个带groupId = org.abc和的库artifactId = myLibrary.模块名称的推荐名称是什么:myLibraryorg.abc.myLibrary?是否有任何命名方案的官方指南?

java java-9 java-module

24
推荐指数
2
解决办法
3409
查看次数