代码之家  ›  专栏  ›  技术社区  ›  Ray Tayek

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

  •  1
  • Ray Tayek  · 技术社区  · 7 年前

    Gradle具有源兼容性和可设置的TargetCompatibility变量。Eclipse具有JDK兼容性、生成的类文件兼容性和源代码兼容性。

    有没有办法自动设置一个和另一个?理想情况下,Gradle内容将由Eclipse内容设置。

    编辑:这些内容似乎存储在:org.eclipse.jdt.core.prefs中

    编辑2:它们看起来像:

    D:\ray\dev\conradapps\printg>cat.settings\org.eclipse.jdt.core.prefs eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=已启用 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=11 org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.AsserteIdentifier=error org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8

    我可以让它如下工作,但这是一个黑客:)

    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]
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   tryman    7 年前

    对如果您希望Gradle将您的配置提供给Eclipse,基本上,从Gradle 5.1.1开始,只需添加:

    sourceCompatibility = '1.7'
    targetCompatibility = '1.8'
    

    到build.gradle文件。请注意,在java 10之前,枚举是1.8、1.9、1.10,但在java 11和未来版本中,枚举是11、12等 Gradle docs . answer :对于我来说,在Gradle 5.0中,java版本可以使用引号,也可以不使用引号(1.8或“1.8”),这是最新版本的javadocs中指定的。在compileJava{}的内部和外部添加时,它也起作用。我在一个多项目构建中对此进行了测试。

    我不确定Eclipse到Gradle的配置传输。但是,它不是应该走另一条路吗?Gradle是一个中心配置工具,用于配置构建过程以及您正在使用的任何IDE(您或您的合作者)。即使可能,Gradle也会操作.classpath和其他Eclipse文件。因此,可以肯定的是,如果这是一个关键点,我更愿意将配置添加到Gradle中,让它处理Eclipse或任何其他IDE文件。

    推荐文章