Java 9 弃用了六个包含Java EE API的模块,它们将很快被删除:
javax.activation
包的java.activationjavax.activity
,javax.rmi
,javax.rmi.CORBA
,和org.omg.*
包javax.transaction
包的java.transactionjavax.xml.bind.*
包的java.xml.bindjavax.jws
,javax.jws.soap
,javax.xml.soap
,和所有javax.xml.ws.*
包javax.annotation
包的java.xml.ws.annotation哪些维护的第三方工件提供了这些API?它们提供这些API或它们必须提供的其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?
为了更容易收集知识,我回答了迄今为止我所知道的并将答案作为社区维基.我希望人们能够扩展它,而不是写出自己的答案.
在您投票结束之前:
我有一个简单的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 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) 昨天我了解了一个名为Stack的新Haskell工具.乍一看,看起来它与Cabal完全相同.那么,它们之间有什么区别?堆叠是Cabal的替代品吗?在哪些情况下我应该使用Stack而不是Cabal?什么可以堆栈做Cabal不能?
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
吗?
我在这里看到很多线程比较并尝试回答哪个更快: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) 考虑以下类:
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 9有三种方法可以将编译后的代码打包到文件中:
JIMAGE针对速度和空间进行了优化,并在运行时由JVM使用,因此有理由引入JIMAGE.JIMAGE文件不应发布到maven repos或在编译或链接时使用.
文档声称JMOD可以存储本机代码和JAR文件无法存储的其他内容,开发人员可以制作和分发自己的JMOD文件.JDK附带jmods/
包含JDK 所有模块的目录,供用户依赖.
问题:
在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.有没有办法排除这些重复的搜索结果?
假设我有一个带groupId = org.abc
和的库artifactId = myLibrary
.模块名称的推荐名称是什么:myLibrary
或org.abc.myLibrary
?是否有任何命名方案的官方指南?
java ×8
java-9 ×6
java-11 ×2
java-8 ×2
java-module ×2
javac ×2
maven ×2
cabal ×1
ecj ×1
eclipse ×1
haskell ×1
java-10 ×1
java-ee ×1
java-platform-module-system ×1
jmh ×1
list ×1
module-info ×1
performance ×1