无法使用自动配置脚本在代理后面下载嵌入式 MongoDB

Posted

技术标签:

【中文标题】无法使用自动配置脚本在代理后面下载嵌入式 MongoDB【英文标题】:Unable to download embedded MongoDB, behind proxy, using automatic configuration script 【发布时间】:2018-11-07 20:23:39 【问题描述】:

我有一个使用 Maven 构建的 Spring Boot 项目,我打算在其中使用嵌入式 mongo db。我在 Windows 7 上使用 Eclipse。

正如我在 Internet 选项的“连接”选项卡中观察到的那样,我使用了一个使用自动配置脚本的代理。 尝试运行应用程序时出现以下异常。

java.io.IOException: 无法打开 https://downloads.mongodb.org/win32/mongodb-win32-i386-3.2.2.zip 的 inputStream 在 de.flapdoodle.embed.process.store.Downloader.downloadInputStream(Downloader.java:131) ~[de.flapdoodle.embed.process-2.0.1.jar:na] 在 de.flapdoodle.embed.process.store.Downloader.download(Downloader.java:69) ~[de.flapdoodle.embed.process-2.0.1.jar:na] ....

当我在网络浏览器中点击以下 URL 时,MongoDB 下载得很好:

https://downloads.mongodb.org/win32/mongodb-win32-i386-3.2.2.zip

这让我相信我的 Eclipse 中可能缺少一些配置,或者可能是 maven 项目本身。 请帮我找到正确的配置。

【问题讨论】:

使用de.flapdoodle.embed.mongo?如果是这样,人们仍然在使用它,有点惊讶。它在下载和运行 mongodb 安装时所做的一切。似乎大量“spring boot”用户误以为这是一个“嵌入式数据库”,但事实并非如此。 我想用它进行开发测试。 使用 cntlm 解决您的问题,这将解决所有问题。使用这个guide 【参考方案1】:

在 Windows 机器上什么对我有用:

下载 zip 文件 (https://downloads.mongodb.org/win32/mongodb-win32-i386-3.2.2.zip) 手动把它(不是解压)放到这个文件夹里:

C:\Users\<Username>\.embedmongo\win32\

【讨论】:

此解决方案不适用于 Linux。该文件已经存在。【参考方案2】:

确实问题在于您的代理(我猜是公司代理)。

如果代理不需要身份验证,您只需添加适当的-Dhttp.proxyHost=...-Dhttp.proxyPort=...(或/和“https.[.. .]") 作为 Eclipse junit Runner 中的 JVM 参数,如下所示:https://github.com/learning-spring-boot/learning-spring-boot-2nd-edition-code/issues/2

【讨论】:

【参考方案3】:

您的问题的一个解决方案是执行以下操作。

    下载 MongoDB 并将其放置在公司网络内的 ftp 服务器上(您不需要代理)。

    然后像这样在你的项目中写一个配置

    @Bean
    @ConditionalOnProperty("mongo.proxy")
    public IRuntimeConfig embeddedMongoRuntimeConfig() 
        final Command command = Command.MongoD;
        final IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
            .defaults(command)
            .artifactStore(new ExtractedArtifactStoreBuilder()
                .defaults(command)
                .download(new DownloadConfigBuilder()
                    .defaultsForCommand(command)
                    .downloadPath("your-ftp-path")
                    .build())
                .build())
            .build();
        return runtimeConfig;
    
    

使用mongo.proxy 属性,您可以控制 Spring Boot 是从您的 ftp 服务器还是从外部下载 MongoDB。如果设置为 true,则从 ftp 服务器下载。如果没有,那么它会尝试从 Internet 下载。

【讨论】:

【参考方案4】:

遇到了同样的问题(对于 Spring Boot 2.6.1,spring.mongodb.embedded.version 属性是必需的)。

为了配置代理,我自己添加了配置bean:


    @Value("$spring.mongodb.embedded.proxy.domain")
    private String proxyDomain;

    @Value("$spring.mongodb.embedded.proxy.port")
    private Integer proxyPort;

    @Bean
    RuntimeConfig embeddedMongoRuntimeConfig(ObjectProvider<DownloadConfigBuilderCustomizer> downloadConfigBuilderCustomizers) 
        Logger logger = LoggerFactory.getLogger(this.getClass().getPackage().getName() + ".EmbeddedMongo");
        ProcessOutput processOutput = new ProcessOutput(Processors.logTo(logger, Slf4jLevel.INFO), Processors.logTo(logger, Slf4jLevel.ERROR), Processors.named("[console>]", Processors.logTo(logger, Slf4jLevel.DEBUG)));
        return Defaults.runtimeConfigFor(Command.MongoD, logger).processOutput(processOutput).artifactStore(this.getArtifactStore(logger, downloadConfigBuilderCustomizers.orderedStream())).isDaemonProcess(false).build();
    

    private ExtractedArtifactStore getArtifactStore(Logger logger, Stream<DownloadConfigBuilderCustomizer> downloadConfigBuilderCustomizers) 
        de.flapdoodle.embed.process.config.store.ImmutableDownloadConfig.Builder downloadConfigBuilder = Defaults.downloadConfigFor(Command.MongoD);
        downloadConfigBuilder.progressListener(new Slf4jProgressListener(logger));
        downloadConfigBuilderCustomizers.forEach((customizer) -> 
            customizer.customize(downloadConfigBuilder);
        );
        DownloadConfig downloadConfig = downloadConfigBuilder
                .proxyFactory(new HttpProxyFactory(proxyDomain, proxyPort))  // <--- HERE
                .build();
        return Defaults.extractedArtifactStoreFor(Command.MongoD).withDownloadConfig(downloadConfig);
    

【讨论】:

【参考方案5】:

就我而言,我必须将 HTTPS 公司代理添加到 Intellij 运行配置。

Https 因为它正在尝试下载:

https://downloads.mongodb.org/win32/mongodb-win32-x86_64-4.0.2.zip

application.properties:

spring.data.mongodb.database=test
spring.data.mongodb.port=27017
spring.mongodb.embedded.version=4.0.2

请记住,这是一个 (DEV) 设置。

【讨论】:

以上是关于无法使用自动配置脚本在代理后面下载嵌入式 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

手机自动化配置代理后无法获取到项目脚本

gCloud SDK无法在公司代理后面的macOS中安装

无法让 SBT 从 Artifactory Pro 公司代理后面下载自己

nginx 后面的 Grafana 6.7 auth 代理,用于自动 UI 登录

使用本脚本可以自动批量完成中间节点环境的部署工作,包括:Nginx编译安装添加程序管理脚本设置开机启动反向代理配置证书分发添加iptables规则等

无法在代理后面下载 Docker 映像