Puisque j'essaie de créer un environnement de docker + eclipse + eclim + vim à portée de main, j'ai essayé de réécrire le chemin du fichier dans le fichier .classpath
écrit par gradle eclipse
d'un chemin absolu vers un chemin relatif.
$ mkdir javajava/ && cd javajava/
Créez un fichier pour utiliser gradle à partir du conteneur Docker.
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/
Je monte ./. Gradle
du côté hôte sur / root / .gradle /
du côté conteneur et je le cache également côté hôte, donc lors du référencement de ce projet à partir d'un autre conteneur eclimd , Je veux que le chemin dans .classpath
soit un chemin relatif.
Donc, si vous créez le fichier ci-dessus, vous pouvez exécuter ce qui suit pour le moment.
$ docker-compose run --rm java8 gradle tasks
Tout d'abord, créez un script de construction approprié et écrivez .classpath
avec 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
(Abréviation)
$ 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>
Comme mentionné ci-dessus, le chemin est / root / .gradle
, qui est un paramètre qui ne peut être utilisé nulle part ailleurs.
.classpath
comme chemin relatifIci, ajoutez ce qui suit à build.gradle
.
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)
}
}
}
}
}
}
}
Essayez de relancer gradle eclipse
.
$ docker-compose run --rm java8 gradle eclipse (Abréviation)
$ 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>
C'était root / .gradle
, mais maintenant c'est .gradle
, donc on a l'impression qu'il peut être utilisé en dehors du conteneur java8.
.classpath
whenMerged
nécessaire pour réécrire le contenu de .classpath
à l'exécution de gradle eclipse
Recommended Posts