我有两个项目,一个是Angular Project(前端应用程序),另一个是Spring boot(Rest Api's)。
当我分别运行两个项目时,一切正常。但是现在我想为这两个项目生成一个可运行的jar文件,以这样的方式,当我在localhost:8081中运行jar时,它应该同时启动Angular模块和spring boot模块。

我已将以下插件添加到我的pom.xml文件中

<plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${build.directory}/classes/static/</outputDirectory >
                            <resources>
                                <resource>
                                    <directory>../angular6-MyProject/dist</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
        </plugin>

最佳答案

快速回答

您需要将静态文件复制到${build.directory}/classes/META-INF/resources文件夹中,以便servlet容器从war / jar文件内部将它们用作静态文件(这就是https://www.webjars.org的工作方式)。

直接从jar处理HTML

Spring Boot documentation的“静态内容”部分中,您可以找到


  默认情况下,Spring Boot从类路径中的/ static目录(或/ public或/ resources或/ META-INF / resources)或ServletContext的根目录中提供静态内容


/META-INF/resources是“标准”方式(尽管不是最直观的方式),它直接来自Java Servlet Specification 3.0(来自JavaEE版本6)。


  Web应用程序作为目录的结构化层次结构存在。此层次结构的根用作应用程序一部分文件的文档根。例如,对于具有上下文路径的Web应用程序
  Web容器中的/catalog,位于Web应用程序层次结构基础上的index.html文件,或位于WEB-INF/lib内的JAR文件,其中包括
  可以提供index.html目录下的META-INF/resources以满足/catalog/index.html.的请求


因此,设置适当的路径应该可以完成这项工作。

将Angular应用程序视为依赖项

引用的JavaEE规范也是webjars利用的。 Webjars是打包到JAR存档文件中的客户端依赖项。 Webjar的存在的主要原因是避免添加和管理客户端依赖项(例如Angular,jQuery),这通常会导致难以维护代码库。

但是如果Angular可以是一个webjar,那么您的前端也可以。我倾向于将Angular应用程序打包为jar文件,并将其视为依赖项。

前端应用

从Maven驱动npm +创建Jar文件

<project>

    <groupId>com.examplegroupId>
    <artifactId>myapp-ui</artifactId>
    <packaging>jar</packaging>

    <build>
        <plugins>
           <!-- run the frontend (npm / bower stack) and update dependencies -->
            <plugin>
                <groupId>com.github.eirslett</groupId>
                <artifactId>frontend-maven-plugin</artifactId>
                <configuration>
                    <installDirectory>target</installDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>install node and npm</id>
                        <goals>
                            <goal>install-node-and-npm</goal>
                        </goals>
                        <phase>generate-resources</phase>
                        <configuration>
                            <nodeVersion>v8.9.1</nodeVersion>
                            <npmVersion>5.5.1</npmVersion>
                        </configuration>
                    </execution>
                    <execution>
                        <id>npm install</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                        <phase>generate-resources</phase>
                        <configuration>
                            <arguments>install</arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>npm build</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                        <phase>generate-resources</phase>
                        <configuration>
                            <arguments>run build</arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- copy everything as a webjar -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/classes/META-INF/resources</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>dist/</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>


后端应用

直接使用依赖项

<dependencies>
    <dependency>
        <groupId>com.example<groupId>
        <artifactId>myapp-ui</artifactId>
    </dependency>
</dependencies>


告示

我在使用webjar时遇到的一些问题和发现:


我已经看到了Webjar和Web字体的一些问题(当从jar文件中投放时,浏览器无法加载字体)
有一些方法可以使用npm工具来构建webjar,而我见过的所有软件包都需要在下面使用java。我还没有看到任何本地JS解决方案
Webjar本身不会影响应用程序的性能,但是从Servlet容器提供静态内容的性能(就可能的吞吐量而言)总是比从Nginx提供的性能低得多。

10-05 23:39