我有一个简单的Spring启动课是这样的:
@SpringBootApplication
public class Starter {
public static void main(String... args) {
if ("foo".equals(args[0])) {
SpringApplication.run(Foo.class, args);
} else if ("bar".equals(args[0])) {
SpringApplication.run(Bar.class, args);
}
}
}
java和bar.java文件是作为依赖项嵌套在当前jar文件中的主类文件,并且还用@SpringBootApplication进行了注释。jar文件结构如下所示。
├───BOOT-INF │ ├───classes │ │ ├───com │ │ │ └───app │ │ │ └───starter │ │ │ └───Starter.class | | | │ │ └───config │ └───lib | ├───tool1.jar | | └───Foo.java | └───tool2.jar | └───Bar.java ├───META-INF │ └───maven │ └───com.app.starter │ └───starter └───org └───springframework └───boot └───loader ├───archive ├───data ├───jar └───util
当我试图启动starter.java时,这在eclipse中运行得很好,但当我试图用maven构建项目时,却遇到了异常:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project starter: Compilation failure: Compilation failure:
[ERROR] /C:/Projects/Starter/src/main/java/com/app/starter/Starter.java:[6,19] cannot find symbol
[ERROR] symbol: class Starter
以下是Starter POM文件的节选:
<project>
.....
<parent>
<groupId>com.app.myproject</groupId>
<artifactId>parent-tool</artifactId>
<version>1.0</version>
</parent>
<artifactId>starter</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.app.myproject</groupId>
<artifactId>foo-project</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.app.myproject</groupId>
<artifactId>bar-project</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
项目结构如下所示:
我有一个聚合器POM作为父项目,它也将parent声明为spring-boot-starter。Foo、Bar和Starter项目都是父项目的子项目。
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {new URL("tool1.jar")});
Class myClass = cl.loadClass("com.app.Foo");
Method mainMethod = myClass.getMethod("main");
Object myClassObj = myClass.newInstance();
Object response = mainMethod.invoke(myClassObj);
有人能建议一下哪种方法来实现这一点吗?任何想法都非常感谢。
经过长时间的研究,在团队领导的帮助下,我终于找到了解决方案。这实际上是spring-boot-maven插件创建的可执行jar依赖项的问题。我的starter类无法在依赖项列表中找到foo.java或bar.java,因为这些JAR也是可执行的JAR。最后,我在foo-project和bar-project POM文件中添加了这些行:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
这使得foo-project和bar-project jar成为一般的jar,并且所有的工作都按照预期进行。
希望这对使用spring-boot-maven插件的人有所帮助。
最近,我写了一个Spring-Boot项目,我希望Maven能够创建一个jar文件,我可以通过命令“java-jar”运行该文件。 这是我编写的pom.xml: 您能否考虑一种配置pom.xml文件的方法,使我能够使用“native”命令“mvn clean package”而不是繁琐的“mvn clean package spring-boot:repackage”获得jar文件? 谢谢
我需要从我的应用程序中制作一个可执行的jar包。 这是我的pom.xml: 我用mvn clean package-DskipTests=true构建包,并通过java-jar运行它,我得到了以下结果: mvn--version Apache Maven 3.6.0(NON-CANONICAL_2018-11-06T03:14:22 01:00_root;2018-11-06T03:14:22 0
问题内容: 我有一个Maven项目,我想从中创建两个可执行的jar文件。一个将与用户交互使用,第二个将作为计划作业运行,读取前者生成的日志文件。最后,除了MANIFEST.MF文件中的Main- Class属性外,我希望两个jar文件都相同。 我正在使用maven-antrun- plugin创建一个可执行jar,在我尝试通过引入Maven配置文件尝试创建第二个jar文件之前,这似乎工作得很好。我
问题内容: 使用Maven 3.1 Eclipse Helios Aspekt: 尝试使用maven-jar / dependency-plugins创建可运行的jar文件。 问题: 创建jar文件和依赖项后,当我尝试使用命令启动jar文件时出现NoCLassDefFoundErrors 但是类/文件可以在./dependency-jars文件夹中找到???我还尝试了以下命令: 这也不起作用。 题
是否可以在Spring Boot可执行jar中启动与声明的mainClass不同的Java类(使用main方法)? 特性:应该启动的类位于嵌入可执行jar(在lib文件夹中)的库中。 背景资料: 可执行jar包含一个库,其中包含一个类,我想调用该类以正常关闭应用程序。该库嵌入在可执行文件jars lib文件夹中,默认Java类路径参数无法访问该库。
问题内容: 我想使用码头来启动我的应用程序,因此我添加了下面提到的依赖项。当我运行主要方法Jetty成功启动时(我正在一个struts2 + spring3 + hibernate maven项目中,我也可以将其部署在tomcat中) 现在,我想从war包装pom创建一个可执行jar。所以我在pom中添加了maven-assembly-plugin。(我尝试使用maven jar插件,但未添加依赖