[JAVA] Geben Sie den relativen Pfad in der durch Gradle Eclipse generierten .classpath-Datei aus

Überblick

Da ich versuche, eine Umgebung aus Docker + Eclipse + Eclim + Vim zu erstellen, habe ich versucht, den Dateipfad in der von "Gradle Eclipse" geschriebenen ".classpath" -Datei von einem absoluten Pfad zu einem relativen Pfad umzuschreiben.

Vorbereitung

$ mkdir javajava/ && cd javajava/

Erstellen Sie eine Datei für die Verwendung von gradle aus dem Docker-Container.

Dockerfile:

FROM openjdk:8
WORKDIR /usr/local/app
ENV M2_HOME=/apache-maven-3.5.4/
ENV PATH=$PATH:/apache-maven-3.5.4/bin/:/gradle-4.8.1/bin/
RUN cd / && \
    wget http://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz && \
    tar xzvf apache-maven-3.5.4-bin.tar.gz && \
    rm apache-maven-3.5.4-bin.tar.gz
RUN cd / && \
    wget https://downloads.gradle.org/distributions/gradle-4.8.1-bin.zip && \
    unzip gradle-4.8.1-bin.zip && \
    rm gradle-4.8.1-bin.zip

docker-compose.yml:


version: "3"
services:
  java8:
    build: .
    volumes:
      - .:/usr/local/app
      - .m2/:/root/.m2/
      - .gradle/:/root/.gradle/

Ich mounte ./. Gradle auf der Hostseite zu / root / .gradle / auf der Containerseite und speichere es auch auf der Hostseite zwischen, wenn ich also auf dieses Projekt von einem anderen Eclimd-Container aus verweise Ich möchte, dass der Pfad in ".classpath" ein relativer Pfad ist.

Wenn Sie also die obige Datei erstellen, können Sie vorerst Folgendes ausführen.

$ docker-compose run --rm java8 gradle tasks 

Schlechtes Muster

Erstellen Sie zunächst ein geeignetes Build-Skript und schreiben Sie ".classpath" mit "gradle eclipse".

build.gradle:

apply plugin: 'eclipse'
apply plugin: 'java-library'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'log4j', name: 'log4j', version: '1.2.17'
}
$ docker-compose run --rm java8 gradle eclipse
(Abkürzung)
$ cat .classpath 
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="output" path="bin/default"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
        <classpathentry sourcepath="/root/.gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.17/677abe279b68c5e7490d6d50c6951376238d7d3e/log4j-1.2.17-sources.jar" kind="lib" path="/root/.gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.17/5af35056b4d257e4b64b9e8069c0746e8b08629f/log4j-1.2.17.jar">
                <attributes>
                        <attribute name="gradle_used_by_scope" value="main,test"/>
                </attributes>
        </classpathentry>
</classpath>

Wie oben erwähnt, lautet der Pfad "/ root / .gradle". Diese Einstellung kann nirgendwo anders verwendet werden.

Exportieren Sie .classpath als relativen Pfad

Fügen Sie hier Folgendes zu build.gradle hinzu.

import java.util.regex.Pattern
import org.gradle.plugins.ide.eclipse.model.Library
import org.gradle.plugins.ide.eclipse.model.internal.FileReferenceFactory

eclipse {
    classpath {
        file {
            whenMerged { classpath ->
                classpath.getEntries().each {
                    if (it instanceof Library) {
                        def path = it.getPath()
                        def sourcePath = it.getSourcePath()
                        def pattern = Pattern.compile(gradle.gradleUserHomeDir.absolutePath)
                        it.setPath(path.replaceFirst(pattern, ".gradle"))
                        if(sourcePath) {
                            def newSourcePath = sourcePath.path.replaceFirst(pattern, ".gradle")
                            def fileReference = new FileReferenceFactory().fromPath(newSourcePath)
                            it.setSourcePath(fileReference)
                        }
                    }
                }
            }
        }
    }
}

Versuchen Sie, "Gradle Eclipse" erneut auszuführen.

$ docker-compose run --rm java8 gradle eclipse                                                                        (Abkürzung)
$ cat .classpath 
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="output" path="bin/default"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
        <classpathentry sourcepath=".gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.17/677abe279b68c5e7490d6d50c6951376238d7d3e/log4j-1.2.17-sources.jar" kind="lib" path=".gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.17/5af35056b4d257e4b64b9e8069c0746e8b08629f/log4j-1.2.17.jar">
                <attributes>
                        <attribute name="gradle_used_by_scope" value="main,test"/>
                </attributes>
        </classpathentry>
</classpath>

Es war "root / .gradle", aber jetzt ist es ".gradle", so dass es sich anfühlt, als könnte es außerhalb des Java8-Containers verwendet werden.

Referenzmaterial

Recommended Posts

Geben Sie den relativen Pfad in der durch Gradle Eclipse generierten .classpath-Datei aus
So debuggen Sie die generierte JAR-Datei mit Eclipse
Geben Sie das Datum (z. B. JJJJ-MM-TT) in die Protokolldatei ein, die per Logback ausgegeben wird
Protokollausgabe in Datei in Java
Aktivieren Sie die Protokollausgabe sowohl für Dateien als auch für die Konsole mit log4j in Eclipse.
Relativer Pfad beim Ausführen von Tomcat unter Eclipse
FindBugs in Gradle gibt keine Ergebnisse in HTML aus
Ausgabe Bean als JSON im Frühjahr