繁体   English   中英

如何在Gradle和Eclipse之间同步Java源和目标?

[英]How to sync Java source and target between Gradle and Eclipse?

Gradle具有源兼容性和可以设置的targetCompatability变量。 Eclipse具有JDK兼容性,生成的类文件兼容性和源兼容性。

有什么方法可以自动设置一个? 理想情况下,Gradle东西应从Eclipse东西中设置。

编辑:这些东西似乎存储在:org.eclipse.jdt.core.prefs

edit2:它们看起来像:

D:\\ ray \\ dev \\ conradapps \\ printg> cat .settings \\ org.eclipse.jdt.core.prefs eclipse.preferences.version = 1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode = enabled org.eclipse。 jdt.core.compiler.codegen.methodParameters =不生成org.eclipse.jdt.core.compiler.codegen.targetPlatform = 1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal =保留org.eclipse.jdt.core .compiler.compliance = 11 org.eclipse.jdt.core.compiler.debug.lineNumber =生成org.eclipse.jdt.core.compiler.debug.localVariable =生成org.eclipse.jdt.core.compiler.debug.sourceFile =生成org.eclipse.jdt.core.compiler.problem.assertIdentifier = error org.eclipse.jdt.core.compiler.problem.enumIdentifier = error org.eclipse.jdt.core.compiler.release = disabled org.eclipse.jdt。 core.compiler.source = 1.8

我可以使其工作如下,但这是一个hack :)

import java.io.IOException;
import java.nio.file.*;
import java.util.*;
plugins {
    id 'java-library'
    id 'application'
    id 'distribution'
}

repositories {
    jcenter()
}
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
dependencies {
    testImplementation 'junit:junit:4.12'
}
String myMainClass='p.Main'
jar {
  manifest {
    attributes(
      'Main-Class': myMainClass
    )
  }
}
application {
    mainClassName = myMainClass
}
class Hack {
    static String[] hack() throws IOException {
        System.out.println("Working Directory = "+System.getProperty("user.dir"));
        String dir="./.settings";
        String name="org.eclipse.jdt.core.prefs";
        File file=new File(dir,name);
        String[] strings=new String[3];
        for(int i=0;i<strings.length;i++)
            strings[i]="";
        if(file.exists()) System.out.println(file.toString()+" exists.");
        else return strings;
        List<String> lines=new ArrayList<>();
        try {
            if(usePath) {
                Path path=FileSystems.getDefault().getPath(dir,name);
                lines=java.nio.file.Files.readAllLines(path);
            } else {
                BufferedReader bufferedReader=new BufferedReader(new FileReader(file));
                for(String line=bufferedReader.readLine();line!=null;line=bufferedReader.readLine())
                    lines.add(line);
                bufferedReader.close();
            }
            int index;
            for(String line:lines) {
                if(line.startsWith("org.eclipse.jdt.core.compiler.compliance")) {
                    index=line.indexOf("=");
                    if(index>0) {
                        System.out.println("compliance: "+line.substring(index+1));
                        strings[0]=line.substring(index+1);
                    }
                }
                if(line.startsWith("org.eclipse.jdt.core.compiler.source=1.8")) {
                    index=line.indexOf("=");
                    if(index>0) {
                        System.out.println("source: "+line.substring(index+1));
                        strings[1]=line.substring(index+1);
                    }
                }
                if(line.startsWith("org.eclipse.jdt.core.compiler.codegen.targetPlatform")) {
                    index=line.indexOf("=");
                    if(index>0) {
                        System.out.println("target: "+line.substring(index+1));
                        strings[2]=line.substring(index+1);
                    }
                }
            }
        } catch(Exception e) {
            System.out.println("caught: "+e);
        }
        return strings;
    }
    public static void main(String[] args) throws IOException {
        hack();
    }
    static boolean usePath;
}
println("java version is: ${JavaVersion.current()}")
String[] strings=Hack.hack();
if(strings[1]!="") {
    println 'setting source'
    sourceCompatibility = strings[1]
}
if(strings[2]!="") {
    println 'setting target'
    targetCompatibility = strings[2]
}

是。 从Gradle 5.1.1开始,如果希望Gradle将配置提供给Eclipse,只需添加:

sourceCompatibility = '1.7'
targetCompatibility = '1.8'

到您的build.gradle文件。 请注意,在Java 10之前,枚举为1.8、1.9、1.10,但是从Java 11和更高版本开始,枚举为11、12,等等。请查看Gradle文档 如果您偶然发现了这个答案 :对我来说,在Gradle 5.0中,java版本可以带或不带引号(1.8或'1.8'),并且在最新版本的javadocs中进行了指定。 在compileJava {}内部和外部添加时,它也可以工作。 我在多项目构建中对此进行了测试。

我不确定Eclipse到Gradle的配置转移。 难道不是应该反其道而行之吗? Gradle是中央配置工具,用于配置构建过程以及所使用的任何IDE(您或您的协作者)。 即使有可能,Gradle也会操纵.classpath和其他Eclipse文件。 因此,可以肯定的是,如果这是关键点,我希望将配置添加到Gradle中,并使其处理Eclipse或任何其他IDE的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM