当前位置: 首页 > 面试题库 >

运行exec:java时如何注册SPI实现

步嘉德
2023-03-14
问题内容

通过Maven插件运行时,我试图使VertX Mertrics正常工作exec:java。

当我将应用程序打包到fatjar中并使用以下命令运行时,所有工作均按预期进行 java -jar fat.jar -conf config.json -Dvertx.metrics.options.enabled=true

当我运行它时,mvn clean package exec:java -DskipTests我看到:
2016-03-22 18:39:58.833 WARN i.v.c.i.VertxImpl:348 - Metrics has been set to enabled but no VertxMetricsFactory found on classpath

我尝试了几种方法:

添加io.vertx:vertx-dropwizard-metrics:3.2.1为编译依赖项
创建内部指标实施并通过src/main/resources/META-INF/services/io.vertx.core.spi.VertxMetricsFactory文件进行注册(请仔细检查其是否已实际复制到target/classes/META-INF/services/io.vertx.core.spi.VertxMetricsFactory)
还添加${basedir}/src/main/resources为附加的classpath元素(除了上一点之外)
我已经仔细检查了ServiceLoader实际上返回一个空迭代器的调试器。

这是我的exec-plugin配置:

                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <configuration>
                        <additionalClasspathElements>
                            <element>${basedir}/src/main/resources</element>
                        </additionalClasspathElements>
                        <mainClass>io.vertx.core.Launcher</mainClass>
                        <commandlineArgs>run ${vertx.mainVerticle} -conf ${vertx.config}</commandlineArgs>
                        <systemProperties>
                            <systemProperty>
                                <key>vertx.logger-delegate-factory-class-name</key>
                                <value>io.vertx.core.logging.SLF4JLogDelegateFactory</value>
                            </systemProperty>
                            <systemProperty>
                                <key>vertx.metrics.options.enabled</key>
                                <value>true</value>
                            </systemProperty>
                        </systemProperties>
                    </configuration>
                </plugin>

这是exec:exec可以正常工作的配置,但是我想了解是否(以及为什么)不能这样做exec:java


        <profile>
            <id>exec</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>exec</goal>
                                </goals>
                                <phase>process-classes</phase>
                                <configuration>
                                    <executable>java</executable>
                                    <arguments>
                                        <argument>-Dvertx.metrics.options.enabled=true</argument>
                                        <argument>-Dvertx.logger-delegate-factory-class-name=${vertx.logger-delegate-factory-class-name}</argument>
                                        <argument>-classpath</argument>
                                        <classpath />
                                        <argument>io.vertx.core.Launcher</argument>
                                        <argument>run</argument>
                                        <argument>${vertx.mainVerticle}</argument>
                                        <argument>-conf</argument>
                                        <argument>${vertx.config}</argument>
                                    </arguments>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

问题答案:

你尝试exec:exec代替exec:java吗?

exec:exec 在一个单独的进程中运行,这可能会解决您的问题。

ServiceLoader使用应用程序类加载器加载中列出的任何类META-INF/services。这就是为什么ServiceLoader在带有自定义类加载器(例如OSGi)的环境中通常不起作用的原因。

因为Maven为每个Maven插件构造了自己的类加载器,所以即使您声明包含SPI的编译时相关性,这些类也仅对Maven类加载器可见,而对应用程序类加载器不可见。



 类似资料:
  • 我试图在运行时动态创建POJO类并将它们映射到Hibernate。但是,我在第二部分失败了。 生成类文件后,我将其放置在Hibernate扫描POJO的位置。但它不起作用。 我再次尝试重建会话工厂,以便它可以接收新创建的文件,但这不起作用。重建会话工厂也不是一个好的/可扩展的解决方案。 Hibernate设置代码: 错误:

  • 我想设置一个由多个步骤组成的用户注册。每个步骤将以条的形式突出显示。深灰色条将是完成的步骤,浅灰色条将是需要完成的步骤。似乎想不出这样做的方法。请建议。 我们可以在myfitnesspal注册中看到这一点。我在下图的红色框中突出显示了这一点。

  • 我正在搜索一个在运行时注册@RestController的解决方案。我目前正在向

  • 我有一个具有两个endpoint的服务: 公共endpoint:任何人都可以访问它,并打开用户帐户(注册) 受保护endpoint:只有注册用户才能访问它,将授权头用作HTTP POST请求的一部分 用例: 用户首先到达公共endpoint并通过HTTP POST打开帐户,该JSON包含。然后服务生成密码,并将其作为JSON响应传递回用户。 用户从服务中拿回密码后,他应该使用这个(连同他的)通过在

  • 只需要社区评估的东西。下面是一段代码,这是一个创建特定类型实例的简单工厂。该方法将在上下文中注册bean作为原型并返回实例。这是我第一次在运行时配置bean。你能好心评估并提供反馈吗?事先谢谢你。 FLEX Sync工厂已在IoC容器中配置为单例。因此,要创建一个新的同步管理器,我需要执行以下操作: 我使用的是Spring 3.1。请回顾并提供宝贵的反馈。 亲切的问候。

  • 问题内容: 只需要一些由社区评估的东西。以下是一段代码,这是一个创建特定类型实例的简单工厂。该方法将在上下文中将bean注册为原型并返回实例。这是我第一次在运行时配置bean。您能否评价并提供反馈?先感谢您。 FLEX Sync工厂已在IoC容器中配置为单例。因此,要创建新的同步管理器,请执行以下操作: 我正在使用Spring 3.1。请查看并提供您宝贵的反馈意见。 亲切的问候。 问题答案: 这纯