如何在Maven项目中执行在构建过程中使用反射的代码?

发布于 2025-01-22 00:36:52 字数 5587 浏览 3 评论 0 原文

我有一个Maven项目,在构建过程中,我尝试执行代码(理想情况下 compile test 阶段,但我还没有,现在我执行了代码进球执行后)。

为此,我使用:

<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>

我的代码是在构建过程中执行的。但是,它使用 com.google.guava 反射,在这种情况下似乎无法正常工作。

这是一个MRE代码:

package com.example;

import com.google.common.reflect.ClassPath;

import java.io.IOException;

public class LoadedClassesPrinter {

    public static void main(String[] args) throws IOException {
        ClassPath.from(ClassLoader.getSystemClassLoader())
                .getAllClasses()
                .stream()
                .forEach(o -> System.out.println(o.getName()));
    }

}

这是一个mre pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>maven-exec-reflection</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>com.example.LoadedClassesPrinter</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.LoadedClassesPrinter</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

当我从IDE或生成的JAR执行主类(带有依赖项)时,它有效:它打印了一堆类,包括我的 loadedclassesprinter ,正如我所期望的。

...
com.google.j2objc.annotations.RetainedLocalRef
com.google.j2objc.annotations.RetainedWith
com.google.j2objc.annotations.Weak
com.google.j2objc.annotations.WeakOuter
com.example.LoadedClassesPrinter

但是,当我运行 MVN清洁安装程序集:单exec:Java 时,执行了主方法,但它仅打印出较小的类列表,令我惊讶的是,这不包括我的 LoadedClassesprinter

org.codehaus.classworlds.BytesURLConnection
org.codehaus.classworlds.BytesURLStreamHandler
org.codehaus.classworlds.ClassRealm
org.codehaus.classworlds.ClassRealmAdapter
org.codehaus.classworlds.ClassRealmReverseAdapter
org.codehaus.classworlds.ClassWorld
org.codehaus.classworlds.ClassWorldAdapter
org.codehaus.classworlds.ClassWorldReverseAdapter
org.codehaus.classworlds.ConfigurationException
org.codehaus.classworlds.Configurator
org.codehaus.classworlds.ConfiguratorAdapter
org.codehaus.classworlds.DefaultClassRealm
org.codehaus.classworlds.DuplicateRealmException
org.codehaus.classworlds.Launcher
org.codehaus.classworlds.NoSuchRealmException
org.codehaus.plexus.classworlds.ClassWorld
org.codehaus.plexus.classworlds.ClassWorldException
org.codehaus.plexus.classworlds.ClassWorldListener
org.codehaus.plexus.classworlds.UrlUtils
org.codehaus.plexus.classworlds.launcher.ConfigurationException
org.codehaus.plexus.classworlds.launcher.ConfigurationHandler
org.codehaus.plexus.classworlds.launcher.ConfigurationParser$1
org.codehaus.plexus.classworlds.launcher.ConfigurationParser
org.codehaus.plexus.classworlds.launcher.Configurator$1
org.codehaus.plexus.classworlds.launcher.Configurator
org.codehaus.plexus.classworlds.launcher.Launcher
org.codehaus.plexus.classworlds.realm.ClassRealm
org.codehaus.plexus.classworlds.realm.DuplicateRealmException
org.codehaus.plexus.classworlds.realm.Entry
org.codehaus.plexus.classworlds.realm.NoSuchRealmException
org.codehaus.plexus.classworlds.strategy.AbstractStrategy
org.codehaus.plexus.classworlds.strategy.OsgiBundleStrategy
org.codehaus.plexus.classworlds.strategy.ParentFirstStrategy
org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
org.codehaus.plexus.classworlds.strategy.Strategy
org.codehaus.plexus.classworlds.strategy.StrategyFactory

我找到了一组 exec-maven-plugin 的配置,我尝试使用它们,但从未更改任何东西。

我在做什么错?是否有一种简单的方法可以执行代码来在构建过程中使用反射列出我的类?它不必是 exec-maven-plugin com.google.guava ,我向其他插件和库开放。

(我使用Maven 3.8.3和Java 16)

I have a maven project in which I try to execute code during build (ideally between compile and test phases, but I'm not there yet, for now I execute the code after goals execution).

For this purpose, I use :

<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>

My code is executed during build. However, it uses com.google.guava reflection, which does not seem to work as expected in this context.

Here is a MRE code :

package com.example;

import com.google.common.reflect.ClassPath;

import java.io.IOException;

public class LoadedClassesPrinter {

    public static void main(String[] args) throws IOException {
        ClassPath.from(ClassLoader.getSystemClassLoader())
                .getAllClasses()
                .stream()
                .forEach(o -> System.out.println(o.getName()));
    }

}

And here is a MRE pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>maven-exec-reflection</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>com.example.LoadedClassesPrinter</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.LoadedClassesPrinter</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

When I execute the main class from my IDE or from the generated jar (with dependencies), it works : it prints a bunch of classes, including my LoadedClassesPrinter, as I expect.

...
com.google.j2objc.annotations.RetainedLocalRef
com.google.j2objc.annotations.RetainedWith
com.google.j2objc.annotations.Weak
com.google.j2objc.annotations.WeakOuter
com.example.LoadedClassesPrinter

But when I run mvn clean install assembly:single exec:java, the main method is executed, but it only prints a much smaller list of classes, which, to my surprise, does not include my LoadedClassesPrinter:

org.codehaus.classworlds.BytesURLConnection
org.codehaus.classworlds.BytesURLStreamHandler
org.codehaus.classworlds.ClassRealm
org.codehaus.classworlds.ClassRealmAdapter
org.codehaus.classworlds.ClassRealmReverseAdapter
org.codehaus.classworlds.ClassWorld
org.codehaus.classworlds.ClassWorldAdapter
org.codehaus.classworlds.ClassWorldReverseAdapter
org.codehaus.classworlds.ConfigurationException
org.codehaus.classworlds.Configurator
org.codehaus.classworlds.ConfiguratorAdapter
org.codehaus.classworlds.DefaultClassRealm
org.codehaus.classworlds.DuplicateRealmException
org.codehaus.classworlds.Launcher
org.codehaus.classworlds.NoSuchRealmException
org.codehaus.plexus.classworlds.ClassWorld
org.codehaus.plexus.classworlds.ClassWorldException
org.codehaus.plexus.classworlds.ClassWorldListener
org.codehaus.plexus.classworlds.UrlUtils
org.codehaus.plexus.classworlds.launcher.ConfigurationException
org.codehaus.plexus.classworlds.launcher.ConfigurationHandler
org.codehaus.plexus.classworlds.launcher.ConfigurationParser$1
org.codehaus.plexus.classworlds.launcher.ConfigurationParser
org.codehaus.plexus.classworlds.launcher.Configurator$1
org.codehaus.plexus.classworlds.launcher.Configurator
org.codehaus.plexus.classworlds.launcher.Launcher
org.codehaus.plexus.classworlds.realm.ClassRealm
org.codehaus.plexus.classworlds.realm.DuplicateRealmException
org.codehaus.plexus.classworlds.realm.Entry
org.codehaus.plexus.classworlds.realm.NoSuchRealmException
org.codehaus.plexus.classworlds.strategy.AbstractStrategy
org.codehaus.plexus.classworlds.strategy.OsgiBundleStrategy
org.codehaus.plexus.classworlds.strategy.ParentFirstStrategy
org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
org.codehaus.plexus.classworlds.strategy.Strategy
org.codehaus.plexus.classworlds.strategy.StrategyFactory

I found a set of configuration for exec-maven-plugin and I tried to use them but it never changed anything.

What am I doing wrong? Is there an easy way to execute code to list my classes using reflection during build? It does not have to be exec-maven-plugin and com.google.guava, I am open to other plugins and libraries.

(I use maven 3.8.3 and java 16)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文