Maven AppAssembler没有找到课程

尝试修改现有的Java / Tomcat应用程序,以便在他们的教程之后在Heroku上进行部署并遇到AppAssembler未找到入门类的一些问题。 运行目标/ bin / webapp(或部署到Heroku)会导致Error: Could not find or load main class org.stopbadware.dsp.Main

执行java -cp target/classes:target/dependency/* org.stopbadware.dsp.Main然而正常运行。 这是pom.xml的相关部分:

   org.codehaus.mojo appassembler-maven-plugin 1.1.1  target   org.stopbadware.dsp.Main webapp      package  assemble     

我的猜测是mvn package导致AppAssembler没有使用正确的类路径,有什么建议吗?

您的工件包装必须设置为jar ,否则找不到主类。

  ... jar ...  

工件本身会添加在类路径的末尾,因此除了JAR文件之外什么都不会产生任何影响。

尝试:

 mvn clean package jar:jar appassembler:assemble 

能够通过在生成的脚本中将"$BASEDIR"/classes到CLASSPATH行来解决此问题。 由于脚本在每次调用mvn package被重写,我编写了一个调用mvn package的短脚本,然后添加了所需的类路径条目。

显然有点像黑客,但经过8个多小时的尝试更“正确”的解决方案,这将是现在必须做的。 肯定会采用任何更优雅的方式来纠正这里建议的类路径。

我前段时间正在阅读该教程,并且遇到了非常类似的问题。 我带来了一个不同的方法,非常适合我。

首先,如前所述,您需要将POM的类型保存为jarjar ) – 多亏了这一点, appassembler插件将从您的类生成一个JAR文件并将其添加到类路径中。 所以,多亏了你的错误就会消失。

请注意,本教程Tomcat是从应用程序源目录实例化的。 在许多情况下这已经足够了,但请注意,使用该方法,您将无法使用Servlet @WebServlet注释,因为源中的/WEB-INF/classes为空,Tomcat将无法扫描您的servlet类。 因此,该教程中的HelloServlet servlet将不起作用,除非您按照此处所述添加一些额外的Tomcat初始化(资源配置)(顺便说一下,您会发现更多关于该资源配置的SO问题)。

我采取了一些不同的方法:

我在package期间运行了一个org.apache.maven.plugins:maven-war-plugin插件( exploded目标)并使用该生成的目录作为我的应用程序源目录。 使用这种方法,我的Web应用程序目录将使用/WEB-INF/classes “填充” /WEB-INF/classes classes。 这反过来将允许Tomcat正确执行扫描作业(即Servlet @WebServlet注释将起作用)。

我还必须在启动器类中更改我的应用程序的源:

 public static void main(String[] args) throws Exception { // Web application is generated in directory name as specified in build/finalName // in maven pom.xml String webappDirLocation = "target/embeddedTomcatSample/"; Tomcat tomcat = new Tomcat(); // ... remaining code does not change 

我添加的对POM的更改 – 包括在appassembler插件之前的maven-war-plugin plugin:

 ...  org.apache.maven.plugins maven-war-plugin 2.5   package  exploded     ... 

请注意,会调用exploded目标。

我希望小改变能帮到你。


关于该教程和maven构建的另一个评论:请注意,编写本教程是为了说明构建应用程序并在Heroku中运行它是多么简单。 但是,这不是maven构建的最佳方法。

Maven建议您应该坚持每个POM生成一个工件。 在你的情况下,应该有两个工件:

  • Tomcat发射器
  • Tomcat Web应用程序

两者都应该构建为单独的POM,并作为父POM中的模块引用。 如果你看一下该教程的复杂性,将它分成两个模块没有多大意义。 但是如果你的应用程序变得越来越复杂(并且启动器获得了一些额外的配置等),那么进行“拆分”将会很有意义。 事实上,已经创建了一些“Tomcat启动程序”库,所以您可以使用它们。

您可以设置CLASSPATH_PREFIX环境变量:

 export CLASSPATH_PREFIX=target/classes 

它将被添加到生成的脚本的类路径中。

首先,您使用的是旧版本的appassembler-maven-plugin ,当前版本为1.3。

我不明白为什么你要定义

 target 

夹。 这有一个很好的默认值。 所以通常你不需要它。 除此之外,您不需要定义绑定到包阶段的显式执行,因此默认情况下 , appassembler-maven-plugin绑定到包阶段 。

此外,您可以使用useWildcardClassPath配置选项来缩短类路径。

   true flat ...  

并且调用生成的脚本显示错误取决于所有依赖项在文件夹中所在的存储库位置与定义的生成脚本中的位置不同。

Interesting Posts