sourceCompatibility和之间有什么关系/区别targetCompatibility?当它们被设置为不同的值时会发生什么?
根据Gradle文档:
sourceCompatibility是"编译Java源时使用的Java版本兼容性".
targetCompatibility是"为Java生成类的Java版本."
我的理解是,targetCompatibility将生成与特定版本的Java兼容的java字节码,这是一个功能的子集sourceCompatibility吗?
我使用eclipse作为IDE.当我右键单击项目然后单击maven更新我的java版本更改为1.5.这是我到目前为止所做的,我按照这里列出的所有步骤
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.1.3.v20140225</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugin</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
毕竟当我点击"Maven update"时,我的java版本会自动更改为1.5.同样在上述步骤中,前两步的版本也会自动更改为1.5.我怎样才能解决这个问题?
我的maven项目有几个模块:服务器,网络等.
我想在Java 6上构建除了我的服务器模块之外的所有模块.对于服务器模块,我想用Java 7编译它.
这是我下面的pom.xml,但我想如果我将它修改为1.7,那么我的所有模块都将用Java 7编译.另外,maven是否使用JAVA_HOME环境变量来确定要使用哪个Java版本?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<memmax>2048m</memmax>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
编辑另外,下面的输出是
maven --version
表明maven正在用1.7编译我的java代码?
vagrant@dev:~/bin/apache-tomcat-7.0.29/bin$ mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Maven home: /home/vagrant/bin/apache-maven-3.0.4
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: /home/vagrant/bin/jdk1.7.0_07/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-23-generic", arch: "amd64", family: "unix"
Run Code Online (Sandbox Code Playgroud)
谢谢,凯文
我有以下程序:
module-info.java
module a {
}
Run Code Online (Sandbox Code Playgroud)
Main.java
public class Main {
public static void main(String[] args) {
System.out.println(sun.nio.ByteBuffered.class);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序成功编译--add-exports选项:
> javac --add-exports java.base/sun.nio=a module-info.java Main.java
Run Code Online (Sandbox Code Playgroud)
但是,当我添加--release参数时,它会失败:
> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java
error: exporting a package from system module java.base is not allowed with --release
1 error
Run Code Online (Sandbox Code Playgroud)
基本上,这两个命令是等效的.那么为什么后者被禁止呢?
此外,由于IDEA将--release参数传递给javac,如果我的项目需要内部API,这使得IDEA的开发变得不可能.
我正在使用JDK 9 + 178.
在IntelliJ 2018.1(构建,执行,部署>编译器> Java编译器)的首选项中,有一个标记为的复选框:
使用'--release'选项进行交叉编译(Java 9及更高版本)
我在网上搜索时找到了相关信息."?" 单击帮助图标时出现404错误.
这个选项的目的/功能是什么?
我有一个现有的Spring boot应用程序,我建立gradle.这些天我一直在使用JDK / JRE 8,现在我正在尝试使用JDK-11
因此,要检查兼容性,我设置JAVA_HOME到JDK-11,但试图编译Java 8模式
我在下面添加了以下块 build.gradle
compileJava {
targetCompatibility = '1.8'
}
Run Code Online (Sandbox Code Playgroud)
然后我JAVA_HOME明确地设置set JAVA_HOME=C:\Users\arun\Desktop\jdk-11.0.1
然后执行 gradlew clean build
但是我因以下例外而停止了
> Configure project :
Build Version = build-182-ga03cf6c
> Task :compileJava FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileJava'.
> warning: source release 11 requires target release 11
Run Code Online (Sandbox Code Playgroud)
如何指向我JAVA_HOME来JDK-11,但仍然在执行它Java-8 …
我使用org.openjfx:javafx-archetype-simpleMaven 原型启动了我的第一个 JavaFX 项目。
生成的 POM:
\n\n<project xmlns = "http://maven.apache.org/POM/4.0.0"\n xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"\n xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">\n <modelVersion>4.0.0</modelVersion>\n <groupId>com.example.invoicing</groupId>\n <artifactId>Invoicer</artifactId>\n <version>1.0-SNAPSHOT</version>\n <properties>\n <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n <maven.compiler.source>14</maven.compiler.source>\n <maven.compiler.target>14</maven.compiler.target>\n </properties>\n <dependencies>\n <dependency>\n <groupId>org.openjfx</groupId>\n <artifactId>javafx-controls</artifactId>\n <version>14</version>\n </dependency>\n </dependencies>\n <build>\n <plugins>\n <plugin>\n <groupId>org.apache.maven.plugins</groupId>\n <artifactId>maven-compiler-plugin</artifactId>\n <version>3.8.1</version>\n <configuration>\n <release>14</release> ???\n </configuration>\n </plugin>\n <plugin>\n <groupId>org.openjfx</groupId>\n <artifactId>javafx-maven-plugin</artifactId>\n <version>0.0.4</version>\n <configuration>\n <mainClass>com.example.invoicing.App</mainClass>\n </configuration>\n </plugin>\n </plugins>\n </build>\n</project>\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x9e\xa5插件的<release>14</release>行的目的是什么?<configuration><artifactId>maven-compiler-plugin</artifactId>
我找到了 Maven 编译器插件的文档Compiling Your Java Sources。但它只提到<!-- put your configurations here -->。所以我对这里的具体配置选项一无所知。 …
我是java/android的新手,所以我希望这是一个很容易解决的问题.
我已经使用libGDX的设置创建了一个项目,然后我将其导入Android Studio.我不知道Supplier接口只适用于Java 8,并在核心模块中使用它,据我所知,它编译成一个由所有android/html/desktop/ios版本的游戏共享的库.桌面版本运行正常(我安装了Java 8),但我的Android应用程序崩溃了一个NoClassDefFoundError错误(BTW,错误消息显示我写的类的名称,而不是Supplier,但错误消失了,一旦我删除每一个Supplier当我添加它们时引用并返回,所以显然错误消息不显示实际的问题类).
如果我尝试Supplier在我的android模块中使用它,它甚至不会让我导入该类,因此它知道它不支持该Java版本,但它很高兴让我在核心模块中使用它而没有任何警告.我确定删除引用Supplier将解决问题,但如果我无意中使用任何Java 8功能,此修复可能会导致运行时错误,因此不是解决问题的好方法.
我不知道项目在哪里设置使用Java 8,似乎有一堆.gradle,.xml和.iml文件显然都与配置有关.这是我build.gradle在核心模块中的文件:
apply plugin: "java"
sourceCompatibility = 1.6
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceSets.main.java.srcDirs = [ "src/" ]
eclipse.project {
name = appName + "-core"
}
Run Code Online (Sandbox Code Playgroud)
sourceCompatibility = 1.6当我将鼠标悬停在它上面时,Android工作室显示该行显示为灰色并显示"未使用分配".所以这可能是问题的一部分.
我的core.iml文件也包含这一行:
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
Run Code Online (Sandbox Code Playgroud)
另外,这是core根build.gradle文件中的部分:
project(":core") {
apply plugin: "java"
dependencies {
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我应该改变什么来阻止它让我在我的核心项目中使用Java 8?
我可能会为遗留项目做一些交叉编译,我注意到最近的 JDK 仅限于某些特定版本的source,target和releaseJVM 参数。
如何获得这些参数的支持版本?
有谁知道使用 --release 和旧的 -source 和 -target 命令行参数之间的区别吗?
在 javac 手册页中: -source 提供与指定版本的源兼容性 -target 为特定 VM 版本生成类文件
--release 为特定的 VM 版本编译。支持的目标:6、7、8、9、10、11
--release 可以将 -source 和 -target 绑定到同一版本吗?
javac 11可以编译将在java 8 JVM上运行的二进制文件/ jar吗?
如果是这样,用什么标志?
将gradle源兼容性设置为11并将目标兼容性设置为8可以吗?