java 8编译,但还是有META-INF/versions/9/module-info.class
时间: 2024-01-22 21:01:57 浏览: 41
这是因为Java 8编译器不支持模块化,所以当你使用Java 9及更高版本的模块化功能时,编译器会将模块信息文件(module-info.java)转换为META-INF/versions/9/module-info.class文件,并将其打包到JAR文件中。虽然这个文件对于Java 8没有任何意义,但它不会对Java 8的运行造成任何影响,因为Java 8运行时不会查找或使用该文件。
相关问题
java 运行jar包,报没有发现META-INF/versions/9/module-info.class,但jar包内存在
这个问题可能是因为你在使用Java 8或更低版本的Java运行时。在Java 9中,引入了模块化系统,模块信息文件(module-info.java)将被编译为META-INF/versions/9/module-info.class文件,并包含在JAR文件中。
如果你使用Java 8或更低版本的Java运行时,它会忽略META-INF/versions/9目录以及其中的内容,因此可能会报错说找不到module-info.class文件。
要解决这个问题,你可以使用Java 9或更高版本的Java运行时来运行你的JAR文件,或者在使用Java 8或更低版本的Java运行时时,删除META-INF/versions/9目录及其内容。你可以使用以下命令删除该目录:
```
zip -d yourJar.jar META-INF/versions/9/*
```
请将`yourJar.jar`替换为你的JAR文件名。运行该命令后,再次尝试运行JAR文件,应该就能够正常运行了。
怎么样在打jar包时不生成META-INF/versions/9/
在打jar包时,如果你不想要生成`META-INF/versions/9/`目录,可以在编译Java源代码时,使用`-source`和`-target`参数指定源代码和目标JVM版本。例如:
```
javac -source 1.8 -target 1.8 MyClass.java
```
这个命令将编译`MyClass.java`文件,并将Java源代码版本设置为1.8,目标JVM版本设置为1.8。这样,即使你使用Java 9或更高版本的编译器编译该代码,也不会生成`META-INF/versions/9/`目录。
在使用`jar`命令打包时,也可以使用`--release`参数指定JVM版本,例如:
```
jar --create --file=myjar.jar --main-class=MyMainClass --release 8 -C classes .
```
这个命令将使用Java 8的规范打包`classes`目录,并将生成的JAR文件命名为`myjar.jar`,其中`MyMainClass`是JAR文件的入口点类。这样,即使你使用Java 9或更高版本的`jar`命令打包该代码,也不会生成`META-INF/versions/9/`目录。