Java 14 中扩展的 switch 表达式,除了程序员/审阅者的视觉清晰度之外,switch 表达式的需求并不明确。是吗
参考: https: //www.techgeeknext.com/java/java14-features
JDK 14版本:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
Run Code Online (Sandbox Code Playgroud)
JDK 14 字节代码
0: iconst_1
1: istore_1
2: iload_1
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 49
5: 54
6: 54
7: 59
default: 64
}
44: bipush 6
46: goto 65 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 openjdk 14 运行 gradle 6.3 构建,目标是 java 14。我收到以下错误。我知道这与编译文件的版本有关,但我的理解是 gradle 6.3 支持 java 14。
$ ./gradlew build
> Task :shadowJar FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':shadowJar'.
> Unsupported class file major version 58
Run Code Online (Sandbox Code Playgroud)
$ ./gradlew -v
------------------------------------------------------------
Gradle 6.3
------------------------------------------------------------
Build time: 2020-03-24 19:52:07 UTC
Revision: bacd40b727b0130eeac8855ae3f9fd9a0b207c60
Kotlin: 1.3.70
Groovy: 2.5.10
Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM: 14 (Oracle Corporation 14+36-1461)
OS: Windows 10 10.0 …Run Code Online (Sandbox Code Playgroud) 使用 Intellij IDEA,我使用 Gradle 6.4 和 Java 14 创建了一个新的 Gradle 项目,但是当我尝试构建该项目时,出现此错误:
没有枚举常量 org.gradle.api.JavaVersion.VERSION_14
我该怎么办 ?
编辑 1:
我使用的是最新的 EAP 版本的 IDEA。
如果已安装,则无法重新运行JPackage安装程序,第二次似乎只是在没有警告的情况下退出,这在 Windows 上是正确的行为吗?
你可能会问我为什么要这样做?
就我而言,我正在尝试为我的 Java 应用程序构建 JPackage 安装程序,因此我正在构建它并安装它,然后调整设置,重建它并尝试重新安装。我花了一些时间才发现除非我卸载第一个安装(使用控制面板,程序和功能),否则我无法重新安装它
我的案例可能不是通常的用例,但它在没有给出任何原因的情况下退出,感觉不正确。
这也意味着,如果我向客户部署新版本,并且稍后需要修改安装程序,则必须修改版本号才能让用户重新安装,这通常可能是最佳实践,但我并不是特别想要如果应用程序本身没有更改,则执行此操作。
更新:自从通过查看 TaskManager 发现它仍在运行,但似乎没有做任何事情并且没有向用户提供任何指示!
我正在使用JPackage在 Windows 上安装我的 Java 应用程序,我有自己的应用程序图标,我也希望在运行安装程序时也使用它。
我按照此处描述的一般方法运行 jpackage 两次,一次创建资源目录,一次使用资源目录。
例如
jpackage @jpackage.txt --temp target/jpackage
jpackage @jpackage.txt --resource-dir target/jpackage
Run Code Online (Sandbox Code Playgroud)
但是,在两次调用之间,我在创建的目标/jpackage 资源目录中看不到任何要修改的安装程序图标。实际上,我看不到任何可以明显改变的东西,我很想知道人们为 Windows 安装做了什么改变。
@Bean
public DynamoDbClient amazonDynamoDB() {
final AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder().roleSessionName(UUID.randomUUID().toString()).roleArn("roleArn").build();
final StsAssumeRoleCredentialsProvider stsAssumeRoleCredentialsProvider = StsAssumeRoleCredentialsProvider.builder().refreshRequest(assumeRoleRequest).build();
return DynamoDbClient.builder().credentialsProvider(stsAssumeRoleCredentialsProvider).region(Region.EU_WEST_1)
.build();
}
Run Code Online (Sandbox Code Playgroud)
出现错误
导致:org.springframework.beans.BeanInstantiationException:无法实例化 [software.amazon.awssdk.services.dynamodb.DynamoDbClient]:工厂方法“amazonDynamoDB”引发异常;嵌套异常是 java.lang.NullPointerException: STS 客户端不能为 null。在 spring.beans@5.2.7.RELEASE/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) 在 spring.beans@5.2.7.RELEASE/org.springframework.beans.factory。 support.ConstructorResolver.instantiate(ConstructorResolver.java:650) ... 58 个公共帧被省略 原因:java.lang.NullPointerException:STS 客户端不能为空。
当我们在 Java 中使用类时,为每个类字段/方法添加 JavaDoc/注释非常简单:
class Product {
//Product unique identifier
private int id;
}
Run Code Online (Sandbox Code Playgroud)
如果我们将这些类迁移到 Java 记录,则不清楚在这种情况下编写注释/JavaDocs 的最佳实践是什么:
record Product(int id, String name, double price) {
}
Run Code Online (Sandbox Code Playgroud)
因为现在所有字段都在一行中声明。
使用以下命令可以轻松编译 Java 源代码--enable-preview:
<!-- Enable preview features -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>15</release>
<compilerArgs>--enable-preview</compilerArgs>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但你怎么能跑呢exec:java?使用
<!-- Exec plugin.. run with `mvn exec:java` -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>${mainClass}</mainClass>
<commandlineArgs>--enable-preview</commandlineArgs>
<arguments>
<argument>--enable-preview</argument>
</arguments>
</systemProperties>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
仍然会出现以下错误:
An exception occured while executing the Java class.
Preview features are not enabled for Main (class file version 59.65535).
Try running with '--enable-preview'
Run Code Online (Sandbox Code Playgroud) 您好,我遇到了 mssql-jdbc_auth-<Version/Arch>.dll 的问题,如果我手动将其添加到我的路径中,它可以工作,但由于我使用 mave,这不是想要的方式:(。
我将以下几行添加到我的 pom.xml 中
<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc_auth -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc_auth</artifactId>
<version>8.4.1.x64</version>
<type>dll</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)
dll已下载但似乎未加载:(,因为我仍然遇到SQLServerException :此驱动程序未配置为集成身份验证问题。我如何解决这个问题,它只与maven一起使用,而不是将所有计算机上的dll添加到小路?
如何使用新的 Java 14 Switch 表达式将 switch case 声明为默认情况?
我想要的只是:
enum States {
PLAY, STOP
}
...
States state = ...
switch (state) {
case PLAY -> { run(); }
case STOP, default -> { stop(); }
}
Run Code Online (Sandbox Code Playgroud)
哪个不能编译。它使用 Java 17 Preview -Features 进行编译,但这不是解决方案吗?!我真的想避免使用未完成的功能。
它应该相当于旧式的 switch 语句:
switch (state) {
case PLAY: run(); break;
case STOP: // <-- No extra "break;". Intentional fall-through!
default: stop(); break;
}
Run Code Online (Sandbox Code Playgroud)
对于普通的 Java 14(或者可能是 17)来说这可能吗?
java-14 ×10
java ×9
gradle ×2
jpackage ×2
maven ×2
installation ×1
java-16 ×1
java-record ×1
jvm-bytecode ×1
mssql-jdbc ×1
performance ×1
spring-boot ×1