[JAVA] Chemin d'accès relatif en sortie dans le fichier .classpath généré par Gradle Eclipse

Aperçu

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.

Préparation

$ 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 

Mauvais modèle

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.

Exporter .classpath comme chemin relatif

Ici, 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.

Matériel de référence

Recommended Posts

Chemin d'accès relatif en sortie dans le fichier .classpath généré par Gradle Eclipse
Comment déboguer le fichier jar généré avec Eclipse
Mettez la date (par exemple aaaa-MM-jj) dans la sortie du fichier journal par logback
Enregistrer la sortie dans un fichier en Java
Activez la sortie du journal vers les fichiers et la console à l'aide de log4j dans Eclipse.
Chemin relatif lors de l'exécution de Tomcat sur Eclipse
FindBugs dans Gradle ne génère pas de résultats en HTML
Bean de sortie au format JSON au printemps