小编Nic*_*lai的帖子

Java 9:使用第三方jar生成JLink的运行时映像

我想创建一个包含第三方jar的Java 9运行时映像.我创建了一个简单的Java项目(让我们称之为Example)来调用实用程序jar(让我们调用它ExampleUtil.jar).Example包含module-info.javasrc目录中并在Eclipse中运行良好(我已添加ExampleUtil.jar为模块依赖项).如果我打电话:

jlink -v
    --module-path "C:\Program Files\Java\jdk-9.0.4\jmods";C:\Temp
    --add-modules com.example.steven
    --output C:\Temp\image.steven
    --launcher launch=com.example.steven/com.example.steven`
Run Code Online (Sandbox Code Playgroud)

...我收到错误消息:

错误:找不到ExampleUtil模块的module-info.class

有没有办法使用非模块的jar创建运行时映像?谢谢.

java jlink java-9

7
推荐指数
1
解决办法
3086
查看次数

定义 Gradle Wrapper 的路径

为了不弄乱我的项目的顶级目录,我希望 gradle 包装器 JAR 放置在子目录中,例如infra. 我要做这样的事情:

root
 L .infra
    L gradle
       L wrapper
          L gradle-wrapper.jar
          L gradle-wrapper.properties
Run Code Online (Sandbox Code Playgroud)

我希望archiveBasedistributionBase能让我到达那里,但即使强行执行这些设置,我仍然会到达gradle顶层。

configure(rootProject) {

    task wrapper(type: Wrapper) {
        description = 'Generates gradlew and gradlew.bat scripts'
        gradleVersion = '3.2'
        archiveBase = Wrapper.PathBase.PROJECT
        archivePath = ".infra/"
        distributionBase = Wrapper.PathBase.PROJECT
        distributionPath = ".infra/"
    }

}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

gradle gradlew

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

单个Maven模块中的多个Java 9模块?

我有一个有趣的担忧.我习惯了多模块Maven项目.现在我正在调查如何做同样的事情,但也使用Jigsaw.是的,每个Maven模块只能有一个Jigsaw模块吗?在IDE中,我无法在同一个Maven模块中创建第二个.

那么,到目前为止,是否有任何约定或解决方法如何组合模块的两面?

java maven java-platform-module-system java-9

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

AdoptOpenJDK 的 JRE 11+ 是否与在 JDK 上使用 jlink 相同,添加所有依赖项

AdoptOpenJDK 的 JRE 11+ 是否与仅使用jlink并添加所有依赖项相同?

Oracle Java 11 及更高版本不附带仅 JRE 的 JDK,因为您可以使用jlink构建自己的 JRE,其中仅包含您需要的系统模块,这就是我在 Windows 和 Linux 上所做的。

然而,对于如何为某些平台(Docker 和 MacOS)合并 jlinked JRE 对我来说并不是那么明显,并且由于 AdoptOpenJDK 不仅为 JDK 还提供了 JRE 的二进制文件,我想我可能只为这些平台使用 JRE。但是,如果我将 JDK 链接起来并包含所有系统模块依赖项,JRE 是否包含我会得到的所有内容?

java java-11 adoptopenjdk

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

确定所有Java版本中的主要Java版本

在确定Java 8上的主要Java版本时,在使用系统属性之前java.specification.version,请删除1.并解析第二个数字:

  • 在Java 8上,这将产生"1.8"〜> "8"〜>8
  • 在Java 9上,相同的调用导致,NumberFormatException因为系统属性是"9"

什么是确定主要Java版本的面向未来的方法?我们的目标是获得一个int可以if-ed或switch-ed在决定采取哪些代码路径(例如在图书馆激活功能).

java java-9

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

在Hibernate 5中替换SchemaExport(Configuration)

从Hibernate 4迁移到5时,我遇到了构造器的弃用和最终删除SchemaExport(Configuration)。Hibernate 5中有什么好的替代方案?

用例

在测试过程中,我们SchemaExport使用配置了一些属性的配置创建实例,并定义了映射资源:

// somewhere else `Properties` are filled and passed as a parameter
Properties properties = new Properties();
properties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
properties.put("hibernate.connection.driver_class", "org.hsqldb.jdbc.JDBCDriver");
// more properties ...

Configuration configuration = new Configuration();
configuration.setProperties(testProperties);
// parameter `String... mappingResources`
for (final String mapping : mappingResources) {
    configuration.addResource(mapping);
}

// this doesn't compile
SchemaExport schemaExport = new SchemaExport(configuration);
Run Code Online (Sandbox Code Playgroud)

由于删除了构造函数,因此最后一行在Hibernate 5上无法编译。

选件

不推荐使用SchemaExport(MetadataImplementor)构造函数,但是我很难找到创建MetadataImplementor实例的好方法。我找到了一些选择,但对我来说,这些选择似乎都很可疑。

我可以在Hibernate中找到的唯一具体实现是MetadataImplInFlightMetadataCollectorImpl,但是都在中org.hibernate.boot.internal,所以我假设我不应该使用它们。另外,MetadataImpl有一个庞大的构造函数,其中我需要提供每个小细节,并且 …

hibernate hibernate-5.x

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

使用与当前可执行文件相同的可执行文件启动Java进程

我有一些Java代码启动了一个新的Java进程,有效地使用了默认的系统JRE(在我的例子中是JDK 8).相反,我需要它与运行原始进程的版本(例如JDK 9)一起运行.

我怎样才能做到这一点?(该解决方案需要在Java 8和9上运行.)

细节

通过简单地发出java ...命令,代码当前依赖于默认系统JRE .另一种方法是使用类似于System.getProperty("java.home") + "/bin/java"(但与平台无关)的东西,但两者都有相同的问题(对我而言):它们使用系统已知的JVM版本启动Java进程.

更新:这是完全错误的,System.getProperty("java.home")确实做我想要的并返回当前JVM的主目录.(愚蠢的我,我以为我试过了.)

使用相同Java版本启动的一种方法是询问当前进程的可执行文件并重用该文件,但我没有找到它的API.

java

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

将选项/参数文件传递给 Maven 编译器插件

javac命令可以通过在命令行上指定该文件来配置文件@

javac @compileargs
Run Code Online (Sandbox Code Playgroud)

我想在 Maven 中使用该语法,以便我可以在这样的文件中收集部分命令行参数,而不是 Maven 的 pom.xml.

Maven 编译器插件似乎没有特定的标签,所以我尝试了compilerArgs

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
        <compilerArgs>
            <arg>@compile-args</arg>
        </compilerArgs>
        <fork>true</fork>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

但随后javac抱怨:

javac: invalid flag: @compile-args
Usage: javac <options> <source files>
use --help for a list of possible options
Run Code Online (Sandbox Code Playgroud)

不过,如果我得到 Maven 正在执行的实际命令(使用-X)并称其为我自己的工作。

我最近在编译器选项中遇到了类似的空格问题,所以我认为这里有一个类似的过程。

java maven

4
推荐指数
1
解决办法
1756
查看次数

Java 9中接口方法的默认访问修饰符?

Java 9允许我们private在接口中使用方法,这意味着不明确标记public方法不再是多余的.

但是,现在必须这样做吗?我希望规范仍然假定public abstract为保持与早期源代码向后兼容的方法的默认修饰符?

java interface java-9

3
推荐指数
1
解决办法
689
查看次数

如何使用 Java11 解决“无法访问类型 com.sun.crypto.provider.SunJCE”?

我正在尝试将我的应用程序从 Java 8 迁移到 Java 11。在我的一个项目类中,我有一行Security.addProvider(new com.sun.crypto.provider.SunJCE());. 我收到此行的编译错误。如何解决这个问题?

java migration java-11

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

无法在IntelliJ IDEA中运行新的颤振示例代码

我安装了IntelliJ IDEA,下载了flutter和dart插件,安装了android studio和jdk.我打开配置的IntelliJ IDEA指向android sdk和jdk.
我打开了IntelliJ IDEA并创建了新项目 - > flutter.我点击了构建并收到了一条错误消息.

我使用的是Ubuntu 16.04 64位系统

我跑了Flutter Doctor并确认我没有任何新的或缺少安装.调试器中的消息如图所示

The built-in library 'dart:ui' is not available on the stand-alone VM. 
library handler failed export 'dart:ui' show Locale
Process finished with exit code 254 Failed to connect to the VM observatory service: java.io.IOException: Failed to connect: ws://127.0.0.1:46579/ws Caused by: de.roderick.weberknecht.WebSocketException: error while creating socket to ws://127.0.0.1:46579/ws Caused by: java.net.ConnectException: Connection refused
Run Code Online (Sandbox Code Playgroud)

带输出的标准新颤振项目代码

我复制粘贴的调试器输出

java intellij-idea flutter

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

理解Java 8/9函数式编程中的Map和Reduce(lambda表达式).map()和reduce()如何提高性能?

这一行功能编程代码可以: 2*3 + 4*3 + 6*3 + 8*3 + 10*3操作.

 int sum = IntStream.rangeClosed(1,10) /* closed range */
            .filter(x -> x%2 == 0) /* filter to even numbers in range */
            .map(x -> x*3) /* map */
            .sum(); /* actual sum operation happens */
            System.out.println(sum); /* prints 90 */
Run Code Online (Sandbox Code Playgroud)

我明白它在做什么.我想知道在内存分配方面发生了什么?我们可以使用与上述操作相似的旧替代方案.这很容易理解,但基于Lambda的代码更具表现力.

int sum=0;
for(int i=1; i<=10;i++) {
   if(i%2 == 0) {
      sum=sum+i*3; 
      }
    }
System.out.println(sum); /* prints 90 */
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8

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

Junit5错误。您必须为此@ParameterizedTest提供至少一个参数

我正在尝试在JUnit 5中开发参数化测试,如以下示例所示。

@ParameterizedTest
@ArgumentsSource(ArgClassProvider.class)
void testAction_shouldSmth(ArgClass argClass) {
   //...
}


class ArgClassProvider implements ArgumentsProvider {

    @Override
    public Stream<? extends Arguments> provideArguments(ExtensionContext extensionContext) throws Exception {
        return Stream.of(new ArgClass(), new ArgClass()).map(Arguments::of);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试运行测试会导致异常:

java.lang.NoSuchMethodException: com.ots.platform_sl.service.config.service.EarnMilesServiceTestHotels$ArgClassProvider.<init>()
...
org.junit.platform.commons.util.PreconditionViolationException: Configuration error: You must provide at least one argument for this @ParameterizedTest
...
Run Code Online (Sandbox Code Playgroud)

您必须为此@ParameterizedTest提供至少一个参数

此消息使我感到自己做错了,不是吗?

ps我有一个假设,只有基本类型的args可用。

java unit-testing junit5

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