我试图通过我使用JShell API创建的JShell实例在运行时运行一些Java代码.为了演示我的问题,我将分享我的简单代码.
在我目前的设置中,我有一个名为lib的目录,它有MySQL Java驱动程序:mysql-connector-java-5.1.35.jar.
通过命令工具启动JShell并添加所需的模块:
jshell --module-path lib --add-modules mysql.connector.java
Run Code Online (Sandbox Code Playgroud)
然后加载mysql驱动程序适合我:
jshell> Class.forName("com.mysql.jdbc.Driver").newInstance();
$1 ==> com.mysql.jdbc.Driver@42f93a98
Run Code Online (Sandbox Code Playgroud)
我用module-info.javaas 创建了一个类似的Java 9模块:
module example.loadmysql {
requires java.sql;
requires mysql.connector.java;
requires jdk.jshell;
}
Run Code Online (Sandbox Code Playgroud)
src/example/loadmysql/Runner.java:
package example.loadmysql;
import jdk.jshell.*;
import java.sql.*;
public class Runner {
public static void main(String[] args) throws Exception {
// this works because this module requires mysql.connector.java
System.out.println(Class.forName("com.mysql.jdbc.Driver").newInstance());
JShell js = JShell.create();
String code = ""
+ "try {"
+ " Class.forName(\"com.mysql.jdbc.Driver\").newInstance();" …Run Code Online (Sandbox Code Playgroud) 我遵循了Gradle指南来构建Java 9模块,从而使一个简单的基于Java 9的库项目成为现实。特别是,我按照指南中的建议手动设置了模块路径,如下所示:
ext.moduleName = 'com.foo.bar'
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是获取我的整个类路径(由Gradle从我的依赖图中确定),并将其移到模块路径中。
除了一个简单的问题以外,一切工作都很好。我的某些依赖项(例如 org.jetbrains.kotlin:kotlin-stdlib-1.2.10)不是真正的Java 9模块,因为它们缺少module-info.class。它的优良坚持他们的类路径上或模块路径,因为,现在,java将它们转换成所谓的自动模块。
问题就出现了,因为即使是一个自动模块,如果是我的模块的道路上,我需要参考它在requires指令中我的项目的模块。但是由于我-Xlint:all选择了Java编译器,因此会javac产生以下警告:
/path/to/myproject/foo-module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
requires kotlin.stdlib;
^
Run Code Online (Sandbox Code Playgroud)
这个警告对我来说是站不住脚的,因为我也随该-Werror javac标志滚动,因此它使我的构建失败。
因此,似乎我需要将自动模块推送到我的类路径上,并仅在模块路径上保留“ true”模块依赖项...
是否有任何通用或半通用的方式(即未与依赖项名称耦合)在编译器类路径及其模块路径之间拆分我的依赖项?
classpath gradle java-platform-module-system java-9 module-path
---------------------------------------------
package org.zpf.service;
public interface Services {
void test();
}
module org.zpf.service.Services {
exports org.zpf.service;
}
---------------------------------------------
package org.zpf.impl;
import org.zpf.service.Services;
public class Impl implements Services {
@Override
public void test() {
System.out.println("Impl-1");
}
}
module org.zpf.impl.Impl {
requires org.zpf.service.Services;
provides org.zpf.service.Services with org.zpf.impl.Impl;
}
----------------------------------------------
public class Demo {
public static void main(String[] args) {
ServiceLoader.load(Services.class).forEach(Services::test);
}
}
module org.zpf.demo.Demo {
requires org.zpf.service.Services;
uses org.zpf.service.Services;
}
Run Code Online (Sandbox Code Playgroud)
我使用IntelliJ IDEA运行此代码,但看起来子模块未运行.以下是程序的输出:
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA 2018.3.app/Contents/lib/idea_rt.jar=61434:/Applications/IntelliJ IDEA 2018.3.app/Contents/bin" -Dfile.encoding=UTF-8 -p /Users/tubetrue01/IDEA/Test/Demo/target/classes:/Users/tubetrue01/IDEA/Test/Services/target/classes -m org.zpf.demo.Demo/org.zpf.demo.Demo …Run Code Online (Sandbox Code Playgroud) 我正在尝试为单个文档中的多个模块创建 javadoc (jdk11)。
我尝试这样做。
文件/目录结构为:
workspace
doc
maths
src
main
java
net.virtualpsyclab.maths
net
virtualpsyclab
maths
lib
*.java
module-info.java
genutils
src
main
java
net.virtualpsyclab.genutilsm
net
virtualpsyclab
genutilsm
*.java
module-info.java
module-info.java
jdocOptions.txt
files.lst
Run Code Online (Sandbox Code Playgroud)
jdocOptions.txt 包含:
-d doc
--module-source-path .;genutils\src\main\java\net.virtualpsyclab.genutilsm;maths\src\main\java\net.virtualpsyclab.maths
--module workspace,net.virtualpsyclab.genutilsm,net.virtualpsyclab.maths
-verbose
-overview overview.html
Run Code Online (Sandbox Code Playgroud)
files.lst 列出所有 *.java 文件。
三个 module-info.java 文件包含:
workspace\module-info.java
module workspace{
requires net.virtualpsyclab.genutilsm;
requires net.virtualpsyclab.maths;
}
workspace\genutils\src\main\java\net.virtualpsyclab.genutilsm\module-info.java
module net.virtualpsyclab.genutilsm{
exports net.virtualpsyclab.genutilsm;
}
workspace\maths\src\main\java\net.virtualpsyclab.maths\module-info.java
module net.virtualpsyclab.maths{
exports net.virtualpsyclab.maths.lib;
}
Run Code Online (Sandbox Code Playgroud)
我希望模块 net.virtualpsyclab.genutilsm 和 net.virtualpsyclab.maths 的文档出现在目录workspace\doc 中,然后运行命令:
javadoc @jdocOptions.txt @files.lst
Run Code Online (Sandbox Code Playgroud)
从目录工作区中,我看到所有源文件显然正在处理,例如:
Loading …Run Code Online (Sandbox Code Playgroud) 有什么方法可以在运行时使用-p或--module-path参数获取模块路径中包含的目录列表,类似于我使用 获取所有类路径目录的方式System.getProperty("java.class.path")?
我想使用 Eclipse 2018-12 从 Oracle JDK 8 切换到 Open JDK 11。我有以下情况:
在我的 Eclipse 工作区中,我有一个名为example的主 maven 项目,其中包含一些 maven 依赖项my_dependency_1、my_dependency_2,它们也是同一工作区中的 maven 项目。目前,只有示例是模块化的(因此包含一个module-info.java)。其他项目是非模块化的,包含在pom.xml以及example的module-info.java 中的必需(自动)模块中。我认出了以下几点:
当我关闭工作区中除example之外的所有 Eclipse 项目时,所有(非模块化)依赖项 .jar 都会作为自动模块从 .m2 存储库中正确包含在模块路径中,并且我的示例项目运行良好。我可以通过查看Run Configurations > Arguments > Show Command Line来验证这一点。
相比之下,当我在我的工作区中打开带有依赖项的项目时,依赖项不会包含在模块路径中,因此示例项目不会运行(导致启动层初始化时发生错误,java.lang .module.FindException:模块 my_dependency_1,...未找到,示例需要)。
我的问题是:如果我想在我的工作区中打开和使用它们以及我的模块化示例项目,我是否需要将所有my_dependencies_1, ...从非模块化依赖项转换为模块化依赖项,或者是否有任何选项可以让我保留即使与非模块化依赖项目一起工作?我正在寻找一个简单而干净的解决方案,而不是通过手动将时髦的东西附加到启动参数的“黑客”。如果这是不可能的,我更愿意花一些时间将每个依赖项转换为模块化依赖项,其缺点是在仍然为 Java 8 编写的其他项目中不再可用。
谢谢澄清:)
这是演示的基本示例:
pom.xml(项目示例) …
在 Intellij 中使用 Maven 和 JavaFX (2019.1)。我一直在关注这个教程。
我有一个不断发生的奇怪错误 - 每次我继续运行插件时javafx:run,它都会失败,并给出以下错误:
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unrecognized option: --module-path
Run Code Online (Sandbox Code Playgroud)
但是,当我将可执行文件放入javafx-maven-plugin( <executable>"C:\Program Files\Java\jdk-12.0.1\bin\java.exe"</executable>) 中时,它就可以工作。我在 Windows 上,并已将JAVA_HOME系统环境变量设置为C:\Program Files\Java\jdk-12.0.1安装 JDK 的位置。
这是一个奇怪的问题,虽然并不重要,但很高兴知道答案。
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>uk.co.harveyellis</groupId>
<artifactId>HelloFX</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Java 11 构建一个简单的 Maven spring-rest 应用程序,但我不断收到“模块未找到错误”。
我在 SO 上读到了很多类似的问题。我尝试了各种建议 - 删除 Maven 存储库、解决一些警告等,但我仍然无法使项目工作。
我的父母 pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.luv2code</groupId>
<artifactId>spring-rest-demo</artifactId>
<version>1.0</version>
<modules>
<module>nedim</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- Add Spring MVC and REST support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- Add Jackson for JSON converters -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!-- Add Servlet support for
Spring's AbstractAnnotationConfigDispatcherServletInitializer -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<!-- Support for Maven WAR Plugin …Run Code Online (Sandbox Code Playgroud) module-path ×8
java ×7
java-9 ×4
java-module ×3
maven ×3
classpath ×1
eclipse ×1
gradle ×1
java-11 ×1
java-platform-module-system ×1
javadoc ×1
javafx ×1
jshell ×1
service ×1
spring ×1