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.
$ 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
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.
.classpath
als relativen PfadFü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.
Recommended Posts