Gradle如何将一个包含大量jar文件的平面目录转为.m2/repository结构?

Gradle how to turn a flat directory of massive amount of jar files to the .m2/repository structure?

我想知道如何在我的计算机中快速获取一个包含 1K jar 的目录,并让 Gradle 将其结构化为 Maven .m2/repository 结构。我读过 Gradle publishing 功能,但当 jar 数量如此之大时似乎不太可能使用,因为它们没有从 META-INF 中获取信息,而是希望用户指定组 ID和其他细节。

我让你等了一会儿,但我现在想出了一个解决方案。看看这个 bash 脚本:

#!/usr/bin/env sh
PWD=$( pwd )
JARS=$( find $PWD -name '*.jar' )
for JARFILE in $JARS
do
    echo "found JAR: $JARFILE";
    mkdir -p $PWD/extracted/$JARFILE/;
    unzip $JARFILE -d $PWD/extracted/ &> /dev/null;
    if [ -d "$PWD/extracted/META-INF/maven/" ]; then
        POMPROPS=$( find $PWD/extracted/META-INF/maven -name 'pom.properties' );
        echo "found POMPROPS: $POMPROPS";
        POMXML=$( find $PWD/extracted/META-INF/maven -name 'pom.xml' );
        echo "found POMXML: $POMXML";
        ARTIFACTID=$( grep 'artifactId' $POMPROPS | cut -d'=' -f2 | tr -d '\r' );
        GROUPID=$( grep 'groupId' $POMPROPS | cut -d'=' -f2 | tr -d '\r' );
        VERSION=$( grep 'version' $POMPROPS | cut -d'=' -f2 | tr -d '\r' );
        if [[ -f $POMPROPS && -f $POMXML ]]; then
            GROUPDIR=$( sed 's/\./\//g' <<<$GROUPID);
            echo "Group dir: "$GROUPDIR;
            mkdir -p ~/.m2test/repository/$GROUPDIR/$ARTIFACTID/$VERSION/
            cp $POMXML ~/.m2test/repository/$GROUPDIR/$ARTIFACTID/$VERSION/$ARTIFACTID-$VERSION.pom
            cp $JARFILE ~/.m2test/repository/$GROUPDIR/$ARTIFACTID/$VERSION/$ARTIFACTID-$VERSION.jar
        else
            echo "did not find pom properties and/or xml "
            echo "$JARFILE: did not find pom properties and/or xml" >> log.txt
        fi
    else
        echo "$JARFILE: no maven directory found" >> log.txt
    fi
    rm -rf $PWD/extracted/;
done

请先看一下,理解一下。你不应该 运行 任何脚本,而不理解它。我当然不想骗你,但要时刻保持谨慎。您必须安装 sed、grep 和 unzip。然而,大多数发行版都应该有它。

只是 运行 那个脚本,当它在目录内的终端中时。它应该在 ~/.m2test 内组织您的 JAR。如果找不到某些文件,它将被记录在 log.txt 中。最终,您可以尽快将文件从 ~/.m2test 复制粘贴或移动到 ~/.m2,因为您很乐观,所以成功了。

当然:总是做备份(在这种情况下是你的~/.m2)!

当然,只有当您的 JAR 在 META-INF 中有 maven 目录时,这才有效。如果没有,我没有更好的猜测,如何将它组织到本地存储库中。