2024年Clojure状态调查!(点击进入)中分享您的想法!

欢迎!请查看关于页面了解有关如何使用本网站的一些更多信息。

+1
tools.deps

我遇到了这个问题,花了一些时间才弄清楚。

由于某些原因,下载eclipse工件失败了。
这让我感到非常沮丧。
我发现问题在于$HOME/.m2/repository下的目录权限设置错误。

下载依赖项未能写入任何文件到本地的Maven库,这导致我的项目中依赖项解析失败。
错误与FileNotFound相关 - 而不是“我不能写入这个目录”。
这更让人困惑,因为我有一些依赖项在那个目录中(可能是以前下载的)。

我怀疑是挂载到Docker容器内的本地maven库更改了目录权限。

我在Slack上报告了这个问题,并按照Alex Miller的建议提出了这个问题。
他提到这可能是由于maven库引起的,而这超出了tools.deps的控制范围。

在我看来,当maven库试图创建本地文件时,并不会报错,而当tools.deps尝试读取文件时,我们会得到一个异常,这有点令人奇怪。

重现步骤

rm -rf ~/.m2/repository/org/eclipse 
mkdir -p ~/.m2/repository/org/eclipse/
chown root:root ~/.m2/repository/org/eclipse
clojure -Sdeps '{:deps {info.sunng/ring-jetty9-adapter {:mvn/version "0.22.0"}}}'

异常

clojure -Sdeps '{:deps {info.sunng/ring-jetty9-adapter {:mvn/version "0.22.0"}}}'
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
SLF4J:无法加载类"org.slf4j.impl.StaticLoggerBinder"。
SLF4J:采用无操作(NOP)日志记录实现
SLF4J:有关详细信息,请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
警告:S3TransporterFactory类加载失败
构建类路径错误。无法读取org.eclipse.jetty.websocket:websocket-servlet:jar:11.0.15的工件描述符
org.eclipse.aether.resolution.ArtifactDescriptorException:无法读取org.eclipse.jetty.websocket:websocket-servlet:jar:11.0.15的工件描述符

    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(Unknown Source)
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(Unknown Source)
    at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(Unknown Source)
    at clojure.tools.deps.extensions.maven$read_descriptor.invokeStatic(maven.clj:115)
    at clojure.tools.deps.extensions.maven$read_descriptor.invoke(maven.clj:106)
    at clojure.tools.deps.extensions.maven$fn__825.invokeStatic(maven.clj:146)
    at clojure.tools.deps.extensions.maven$fn__825.invoke(maven.clj:143)
    at clojure.lang.MultiFn.invoke(MultiFn.java:244)
    at clojure.tools.deps$expand_deps$children_task__463$fn__465$fn__466.invoke(deps.clj:407)
    at clojure.lang.AFn.applyToHelper(AFn.java:152)
    at clojure.lang.AFn.applyTo(AFn.java:144)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
    at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invokeStatic(core.clj:671)
    at clojure.core$bound_fn_STAR_$fn__7194.doInvoke(core.clj:2020)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.call(AFn.java:18)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1583)

原因:org.eclipse.aether.resolution.ArtifactResolutionException:不能从/to central (https://repo1.maven.org/maven2/)传输工件org.eclipse.jetty.websocket:websocket-servlet:pom:11.0.15:/home/ieugen/.m2/repository/org/eclipse/jetty/websocket/websocket-servlet/11.0.15/websocket-servlet-11.0.15.pom.part.lock(找不到文件或目录)

    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(Unknown Source)
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(Unknown Source)
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(Unknown Source)
    ... 25 more

原因:org.eclipse.aether.transfer.ArtifactTransferException:不能从/to central (https://repo1.maven.org/maven2/)传输工件org.eclipse.jetty.webdriver:webdriver_widget:pom:11.0.15:/home/ieugen/.m2/repository/org/eclipse/jetty/websocket/websocket-servlet/11.0.15/websocket-servlet-11.0.15.pom.part.lock(找不到文件或目录)

    at org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(Unknown Source)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(Unknown Source)
    at org.eclipse.aether.util.concurrency.RunnableErrorForwarder$1.run(Unknown Source)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(Unknown Source)
    at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(Unknown Source)
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(Unknown Source)
    ... 28 more

原因:java.io.FileNotFoundException:/home/ieugen/.m2/repository/org/eclipse/jetty/websocket/websocket-servlet/11.0.15/websocket-servlet-11.0.15.pom.part.lock(找不到文件或目录)

1个回答

0

当您将~/.m2和其他文件通过Docker的卷装卸到Docker中使用,以避免再次下载工件时,这是一个常见问题。如果有文件在Docker内部被下载,那么这个文件可能以root身份写入用户主目录。我在过去几年中也遇到了这个问题至少几次。最后一次是在上周。:slightly_smiling_face: 我也不是Docker专家,也许我在使用过程中做了什么错误的事情。当这种情况发生时,您也很难弄清楚发生了什么,如果您记得您的经历,那也是一种幸运。

我们过去也遇到过这个问题。多年来,我们一直在使用一个名为 "run-as-user.sh" 的脚本,内容如下

```
#!/usr/bin/env bash

set -eu

NEW_UID=$(stat -c '%u' /app)
NEW_GID=$(stat -c '%g' /app)

groupmod -g "$NEW_GID" -o hop >/dev/null 2>&1
usermod -u "$NEW_UID" -o hop >/dev/null 2>&1

exec chpst -u hop:hop -U hop:hop env HOME="/home/hop" "$@"
```

这个脚本作为容器的入口点。然后在容器的Dockerfile中我们也添加了以下行(除了需要为该容器所需的其他所有内容外),以及安装`runit`包(提供`chpst`命令的那个包)所必需的命令,该包是在您的Docker镜像所用的发行版中使用的

```
RUN useradd --home-dir /home/hop --create-home --shell /bin/bash --user-group hop
COPY run-as-user.sh /usr/local/bin
WORKDIR /app
ENTRYPOINT ["run-as-user.sh"]
```

运行容器时,我们在容器内部使用卷挂载所需的任何目录(~/.m2,Clojure应用程序目录等)。我们将在容器下挂载Clojure应用程序目录 `/app`(这是`run-as-user.sh`脚本将查找的地方)。然后`run-as-user.sh`脚本能确保更改容器内使用的账户的UID和GID,与拥有 `/app` 目录的外部用户的UID和GID相匹配。

希望这能有所帮助。
...