首页 > 解决方案 > 使用“spring-boot-maven-plugin”构建的 Java 类路径不起作用

问题描述

尝试使用 jars 构建类路径以使用 java-command 调用我的程序

“java -cp %classpath% %mainclass%”。

但无法设法让它运行。

使用“spring-boot-maven-plugin”构建 jar 时,由于找不到 mainclass,我总是会收到错误消息。使用“maven-jar-plugin/maven-assembly-plugin”构建jar时,找不到Spring环境。我已经设置了一个小示例项目来测试和展示。如果有人可以在这里给我一些帮助,那就太好了。

我的项目如下所示:

mysample-base/pom.xml

<groupId>com.mysamples</groupId>
<artifactId>mySamples-base</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <revision>1.0.0</revision>
    <targetJarDir>E:/$SysProg/mySample/RUN/lib</targetJarDir>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
</parent>

<modules>
   <module>mySamples-frontend</module>
</modules>

<dependencies>

    <!-- *************************************************************************************************** 
        * Springboot *************************************************************************************************** -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>
            <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- *************************************************************************************************** 
        * Database Access *************************************************************************************************** -->


    <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/jaxb2-maven-plugin -->
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>2.5.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <configuration>
                <show>private</show>
                <nohelp>true</nohelp>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${targetJarDir}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

mysample-前端/pom.xml

<artifactId>mySamples-frontend</artifactId>
<packaging>pom</packaging>

<parent>
    <groupId>com.mysamples</groupId>
    <artifactId>mySamples-base</artifactId>
    <version>1.0.0</version>
</parent>

<modules>
    <module>mySamples-frontend-programs</module>
</modules>

mysample-frontend-progams/pom.xml - 带有“spring-boot-maven-plugin”

<artifactId>mySamples-frontend-programs</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

<parent>
    <groupId>com.mysamples</groupId>
    <artifactId>mySamples-frontend</artifactId>
    <version>1.0.0</version>
</parent>


<build>
    <plugins>
  <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>2.3.4.RELEASE</version>
     <configuration>
        <fork>true</fork>
        <mainClass>com.mysamples.calling.MainCalling</mainClass>
     </configuration>
     <executions>
        <execution>
           <goals>
              <goal>repackage</goal>
           </goals>
        </execution>
     </executions>
  </plugin>
    </plugins>
</build>

mysample-frontend-progams/pom.xml - 带有“maven-assembly-plugin”

<artifactId>mySamples-frontend-programs</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

<parent>
    <groupId>com.mysamples</groupId>
    <artifactId>mySamples-frontend</artifactId>
    <version>1.0.0</version>
</parent>


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Build-Version>${project.version}</Build-Version>
                        <Built-By>${user.name}</Built-By>
                        <Build-Jdk>${java.version}</Build-Jdk>
                        <Build-Time>${maven.build.timestamp}</Build-Time>
                        <Build-Number>${buildNumber.value}</Build-Number>
                        <Build-YearStarted>2020</Build-YearStarted>
                        <DeveloperName>Ulrich Schmidt</DeveloperName>
                    </manifestEntries>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我正在运行这个命令:

cd /D .....
SET CLASSPATH=mySamples-frontend-programs-1.0.0.jar
java -Duser.language=en -cp mySamples-frontend-programs-1.0.0.jar com.mysamples.calling.MainCalling

如果使用“spring-boot-maven-plugin”构建 jar,我会收到以下消息: 错误:无法找到或加载主类 com.mysamples.calling.MainCalling

查看 jar 文件显示,主类存储到“ROOT-INF/classes”。在 jar 的根路径中,我只能找到 spring 框架。

如果使用“maven-assembly-plugin”构建 jar,我会收到以下消息:

java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
    at org.springframework.util.Assert.notEmpty(Assert.java:467)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getCandidateConfigurations(AutoConfigurationImportSelector.java:180)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getAutoConfigurationEntry(AutoConfigurationImportSelector.java:123)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector$AutoConfigurationGroup.process(AutoConfigurationImportSelector.java:434)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:878)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:808)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:779)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:192)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at com.mysamples.calling.MainCalling.main(MainCalling.java:27)

创建的两个类是:

@ComponentScan({"com.mysamples"})
@SpringBootApplication
public class MainCalling {

private static final Logger LOGGER = LoggerFactory.getLogger(MainCalling.class);

@Autowired
public MainCalling(final ClassToBeCalled toBeCalled) {
    toBeCalled.isCalled();
}

public static void main(String[] args) {
    try {
        SpringApplication.run(MainCalling.class);
    } catch (Exception e) {
        LOGGER.error("", e);
        System.exit(-1);
    }
}

@Service
public class ClassToBeCalled {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(ClassToBeCalled.class);
    
    public void isCalled() {
        LOGGER.info("have been called");
    }
}

标签: spring-bootmavenjardependencies

解决方案


我想我明白了。“spring-boot-maven-plugin”不允许使用命令“java -cp ${classpath} ${chosenMain}”。您必须使用“java -jar ${classpath}” - 创建jar的方式,仅通过jar的rootDir中的springframework无法直接调用指定的mainClass。如何调用多个主类的方式在“运行多个主类的spring boot ”中有描述

感谢@khmarbaise 的提示。一开始不敢相信,但经过一番阅读,我明白了,他是对的。


推荐阅读