为什么我的 Java9 模块服务不工作?
Why is my Java9 module service not working?
---------------------------------------------
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;
}
我运行这段代码是用IntelliJ IDEA,但是貌似没有子模块running.The下面是程序的输出:
/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
Process finished with exit code 0
您需要做的就是确保模块
module org.zpf.impl // fixing the name from that of question
存在于模块路径上。从命令行执行您共享的命令并添加到 impl
模块的路径按预期工作。
.../jdk-11.jdk/Contents/Home/bin/java -p .../Desktop/modular/out/production/demo:.../Desktop/modular/out/production/modular:.../Desktop/modular/out/production/impl -m org.zpf.demo.Demo/org.zpf.demo.Demo
打印扩展输出
Impl-1
在您的命令行中(为了便于阅读而格式化)
-p /Users/tubetrue01/IDEA/Test/Demo/target/classes:
/Users/tubetrue01/IDEA/Test/Services/target/classes
应该修改成类似
的东西
-p /Users/tubetrue01/IDEA/Test/Demo/target/classes:
/Users/tubetrue01/IDEA/Test/Services/target/classes:
/Users/tubetrue01/IDEA/Test/Impl/target/classes
使用 IntelliJ IDEA,您可以按照以下步骤执行相同的操作:
- 项目结构 > 模块
- Select
Demo
模块 > 导航到依赖项
- 添加依赖[Modal左下角(+)] > 模块依赖
- Select
Impl
模块并应用。
- 运行 你的
Demo
class 现在。
---------------------------------------------
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;
}
我运行这段代码是用IntelliJ IDEA,但是貌似没有子模块running.The下面是程序的输出:
/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
Process finished with exit code 0
您需要做的就是确保模块
module org.zpf.impl // fixing the name from that of question
存在于模块路径上。从命令行执行您共享的命令并添加到 impl
模块的路径按预期工作。
.../jdk-11.jdk/Contents/Home/bin/java -p .../Desktop/modular/out/production/demo:.../Desktop/modular/out/production/modular:.../Desktop/modular/out/production/impl -m org.zpf.demo.Demo/org.zpf.demo.Demo
打印扩展输出
Impl-1
在您的命令行中(为了便于阅读而格式化)
-p /Users/tubetrue01/IDEA/Test/Demo/target/classes:
/Users/tubetrue01/IDEA/Test/Services/target/classes
应该修改成类似
的东西-p /Users/tubetrue01/IDEA/Test/Demo/target/classes:
/Users/tubetrue01/IDEA/Test/Services/target/classes:
/Users/tubetrue01/IDEA/Test/Impl/target/classes
使用 IntelliJ IDEA,您可以按照以下步骤执行相同的操作:
- 项目结构 > 模块
- Select
Demo
模块 > 导航到依赖项 - 添加依赖[Modal左下角(+)] > 模块依赖
- Select
Impl
模块并应用。 - 运行 你的
Demo
class 现在。