我正在探索Project Jigsaw @ JDK 9,几乎所有Java开发人员都在考虑Oracle如何为Java 9带来模块化.
我已经创建了一个示例java项目,代码编译没有任何错误.
下面是生成的字节码文件及其结构
$ tree mods/dictionary.spi/
mods/dictionary.spi/
??? dictionary
? ??? DictionaryService.class
? ??? spi
? ??? Dictionary.class
??? module-info.class
2 directories, 3 files
Run Code Online (Sandbox Code Playgroud)
我尝试为上面的类文件创建jar文件,如下所述.
$ /opt/jigsaw-jdk-9/bin/jar --create --file lib/dictionaryspi.jar --module-version=1.0 mods/dictionary.spi/ .
Run Code Online (Sandbox Code Playgroud)
没有module-info.class的--module-version或--hash-dependencies之一
非常感谢,如果有人为这个错误提供了最佳解决方案.
我试图在教程之后使用Windows 10中的java命令设置一个基本的java项目.文件是
C:\Users\Talon\Desktop\java intellij\01j9\src\com.me.mymodule\module-info.java
C:\Users\Talon\Desktop\java intellij\01j9\src\com.me.mymodule\com\me\mymodule\Main.java
和一个空文件夹C:\Users\Talon\Desktop\java intellij\01j9\mods\com.me.mymodule.
module-info.java
module com.me.mymodule {}
Run Code Online (Sandbox Code Playgroud)
Main.java
package com.me.mymodule;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World from Module");
}
}
Run Code Online (Sandbox Code Playgroud)
在'cd'进入C:\Users\Talon\Desktop\java intellij\01j9>
我应该进入的命令之后
javac -d mods/com.me.mymodule \ src/com.me.mymodule/module-info.java \ src/com.me.mymodule/com/me/mymodule/Main.java
Run Code Online (Sandbox Code Playgroud)
但它是为machintosh操作系统编写的,所以在windows中我尝试过
javac -d mods/com.me.mymodule;src/com.me.mymodule/module-info.java;src/com.me/mymodule/com/me/mymodule/Main.java
Run Code Online (Sandbox Code Playgroud)
和
javac -d mods\com.me.mymodule;src\com.me.mymodule\module-info.java;src\com.me\mymodule\com\me\mymodule\Main.java
Run Code Online (Sandbox Code Playgroud)
在两个我有javac:没有源文件.路径错了还是我应该输入不同的命令?
以下代码(通过JNLP API检索Java Web Start客户端应用程序的基本URL)在Java 8中工作,但在(模块化)Java 9运行时中执行时失败:
Class<?> mclass = Class.forName("javax.jnlp.ServiceManager");
Method lookup = mclass.getMethod("lookup", new Class[]{String.class});
Object basicSvc = lookup.invoke(null, new Object[{"javax.jnlp.BasicService"});
Class<?> sclass = basicSvc.getClass();
Method getCodeBase = sclass.getMethod("getCodeBase", (Class[])null);
URL codebase = (URL)getCodeBase.invoke(basicSvc, (Object[])null); // throws
Run Code Online (Sandbox Code Playgroud)
结果是
java.lang.IllegalAccessException: class app.App cannot access class
com.sun.jnlp.BasicServiceImpl (in module jdk.javaws) because module
jdk.javaws does not export com.sun.jnlp to unnamed module @7202a0fa
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException
at java.base/java.lang.reflect.AccessibleObject.checkAccess
at java.base/java.lang.reflect.Method.invoke
at app.App.init
Run Code Online (Sandbox Code Playgroud)
怎么解决这个问题?
我正在切换到Java 9(用于HTTP/2客户端,以及其他好处),但不打算使用Java 9模块化.
关于无法访问的软件包,我遇到了大量的编译器错误.每个都要求我添加一个额外的--add-exports modulename/packagename=ALL-UNNAMED编译器标志.
是否有一些编译器标志,我可以指定,一次,添加所有导出,而不是再得到编译器错误?
以下是显示问题的示例代码:
package com.prosc.fx;
import com.sun.javafx.stage.WindowHelper;
public class CompilerFlagTest {
public static void main(String[] args) {
WindowHelper.getWindowAccessor();
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息是:
错误:(3,22)java:package com.sun.javafx.stage不可见(包com.sun.javafx.stage在模块javafx.graphics中声明,它不会将其导出到未命名的模块)
在学校,我必须创建一个API,在其中我需要一个shapefile内的几何图形。我使用geotools librairie打开shapefile。这是我的代码:
public class main {
public static void main(String[] args) throws Exception{
String filepath = "SHP_test/testSHPindex.shp";
File shp = new File(filepath);
Map<String, URL> map = new HashMap<String, URL>();
map.put( "url", shp.toURI().toURL() );
DataStore dataStore = DataStoreFinder.getDataStore(map);
SimpleFeatureSource featureSource = dataStore.getFeatureSource(dataStore.getTypeNames()[0]);
SimpleFeatureCollection collection = featureSource.getFeatures();
}
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:
Exception in thread "main" java.lang.IllegalArgumentException: org.geotools.data.DataStoreFactorySpi is not an ImageIO SPI class
at java.desktop/javax.imageio.spi.ServiceRegistry.checkClassAllowed(ServiceRegistry.java:745)
at java.desktop/javax.imageio.spi.ServiceRegistry.<init>(ServiceRegistry.java:140)
at org.geotools.factory.FactoryRegistry.<init>(FactoryRegistry.java:155)
at org.geotools.factory.FactoryCreator.<init>(FactoryCreator.java:91)
at org.geotools.data.DataStoreFinder.getServiceRegistry(DataStoreFinder.java:128)
at org.geotools.data.DataStoreFinder.getAvailableDataStores(DataStoreFinder.java:115)
at org.geotools.data.DataStoreFinder.getDataStore(DataStoreFinder.java:87)
at org.ensg.projetperso.llb.maven.api.spatialindexingtest.testshapefile.main.main(main.java:30)
Run Code Online (Sandbox Code Playgroud)
数据存储区不希望被创建,我不知道它是从哪里来的……您能帮我吗?提前致谢 ..
劳尔
是否可以在Java 9中创建基于继承的(或嵌套的)模块?
像这样的东西:
module a
|
??? module a1
|
??? module a2
Run Code Online (Sandbox Code Playgroud)
在这个例子中,a1和a2模块都是子项a.
如果我导入其中一个子模块,我将获得parent(a)的功能以及该子项中定义的任何功能.也就是说,我可以导入a1,并明确访问两者的功能a和a1(但不包括a2).
这两个a1和a2是一个a,并且可以访问所有的包a,而无需的包揭露a他们.
我想知道Java 9是否内置了对JSON的支持.如果是这样我怎么能导入它?我正在编写一个套接字程序,所以我不是在谈论Java EE,我要导入的目标是一个简单的Java SE类.
在 Java 9 中,我可以跨模块拆分子包吗?例如,我可以com.example.foo在一个模块中同时com.example.foo.bar在另一个模块中吗?
这似乎是一个简单的问题,但由于某种原因,我在搜索后无法找到直接答案。权威的参考将不胜感激。
我假设我可以在不同的模块中拥有同级子包,例如com.example.foo和com.example.other。
我读过 JPMS 的优点之一是更好的封装(除非明确打开,否则所有内容都受到限制)。
但我有一个问题:是什么阻止了程序员替换module-info.class第三方模块 JAR 并导出所有包,甚至制作open模块,因此所有内容都可以通过反射(包括private成员)访问。
JPMS 是否真的可以帮助隐藏内部代码,或者就像 Java 8 及更早版本一样:所有内容都可以通过反射 API 访问,甚至是private成员(从 Java 9 开始只需要额外的步骤来打开模块)?
JPMS 模块名称中不允许使用破折号。据我了解,建议用点替换它们。
但是,我找不到带有替换建议的 Java 模块名称中其他不允许的字符的列表。例如,是否允许使用“_”字符?
java-9 ×10
java ×8
java-platform-module-system ×4
java-module ×3
datastore ×1
jar ×1
jnlp ×1
json ×1
reflection ×1
shapefile ×1