我想创建一个包含第三方jar的Java 9运行时映像.我创建了一个简单的Java项目(让我们称之为Example)来调用实用程序jar(让我们调用它ExampleUtil.jar).Example包含module-info.java在src目录中并在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创建运行时映像?谢谢.
为了不弄乱我的项目的顶级目录,我希望 gradle 包装器 JAR 放置在子目录中,例如infra. 我要做这样的事情:
root
L .infra
L gradle
L wrapper
L gradle-wrapper.jar
L gradle-wrapper.properties
Run Code Online (Sandbox Code Playgroud)
我希望archiveBase或distributionBase能让我到达那里,但即使强行执行这些设置,我仍然会到达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)
我究竟做错了什么?
我有一个有趣的担忧.我习惯了多模块Maven项目.现在我正在调查如何做同样的事情,但也使用Jigsaw.是的,每个Maven模块只能有一个Jigsaw模块吗?在IDE中,我无法在同一个Maven模块中创建第二个.
那么,到目前为止,是否有任何约定或解决方法如何组合模块的两面?
AdoptOpenJDK 的 JRE 11+ 是否与仅使用jlink并添加所有依赖项相同?
Oracle Java 11 及更高版本不附带仅 JRE 的 JDK,因为您可以使用jlink构建自己的 JRE,其中仅包含您需要的系统模块,这就是我在 Windows 和 Linux 上所做的。
然而,对于如何为某些平台(Docker 和 MacOS)合并 jlinked JRE 对我来说并不是那么明显,并且由于 AdoptOpenJDK 不仅为 JDK 还提供了 JRE 的二进制文件,我想我可能只为这些平台使用 JRE。但是,如果我将 JDK 链接起来并包含所有系统模块依赖项,JRE 是否包含我会得到的所有内容?
在确定Java 8上的主要Java版本时,在使用系统属性之前java.specification.version,请删除1.并解析第二个数字:
"1.8"〜> "8"〜>8NumberFormatException因为系统属性是"9"什么是确定主要Java版本的面向未来的方法?我们的目标是获得一个int可以if-ed或switch-ed在决定采取哪些代码路径(例如在图书馆激活功能).
从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中找到的唯一具体实现是MetadataImpl和InFlightMetadataCollectorImpl,但是都在中org.hibernate.boot.internal,所以我假设我不应该使用它们。另外,MetadataImpl有一个庞大的构造函数,其中我需要提供每个小细节,并且 …
我有一些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.
该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 9允许我们private在接口中使用方法,这意味着不明确标记public方法不再是多余的.
但是,现在必须这样做吗?我希望规范仍然假定public abstract为保持与早期源代码向后兼容的方法的默认修饰符?
我正在尝试将我的应用程序从 Java 8 迁移到 Java 11。在我的一个项目类中,我有一行Security.addProvider(new com.sun.crypto.provider.SunJCE());. 我收到此行的编译错误。如何解决这个问题?
我安装了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)
这一行功能编程代码可以: 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) 我正在尝试在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可用。