当前位置: 首页 > 知识库问答 >
问题:

如何从应用程序的类路径运行静态内容以使用(SpringBoot 2.x weblogic*.war)?

陈昂熙
2023-03-14

我有一个网络服务器,我运行到Inlellij Idea用于应用程序的审计工作。我基于SpringBoot 2. x制作了网络应用程序。我正在使用Intellij Idea 2019,在那里我配置了在网络12. x上部署我的网络应用程序。

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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.weblogic</groupId>
    <artifactId>weblogic</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>weblogic</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <version.apache.maven.plugins>3.8.1</version.apache.maven.plugins>
        <version.mapstruct>1.3.0.Final</version.mapstruct>

        <version.apache.common.lang3>3.9</version.apache.common.lang3>
        <version.apache.commons.text>1.8</version.apache.commons.text>
        <version.apache.commons.beanutils>1.9.4</version.apache.commons.beanutils>
        <version.datasource.proxy>1.6</version.datasource.proxy>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>


         <!--исключаем из компиляции встроенный Tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

src/main/webapp/WEB-INF/WEB。xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

</web-app>

SRC/main/webapp/WEB-INF/weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app
                      http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">

    <wls:weblogic-version>12.2.1.4.0</wls:weblogic-version>
    <wls:context-root>/api</wls:context-root>
    <wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>org.slf4j.*</wls:package-name>
            <wls:package-name>org.springframework.*</wls:package-name>
            <wls:package-name>html" target="_blank">javax.persistence.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
</wls:weblogic-web-app>

src/main/webapp/index。html

当我通过Intellij Idea运行weblogic时,我通过URL-http://localhost:7001/apiindex.html

所以,它起作用了。

但我需要更复杂的静态内容,我想把它放到一个应用程序类路径中。

我做了很多…

src/main/resources/templates/pages/index。html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello Weblogic!!!</title>
    <link type="text/css" href="/static/css/style.css" rel="stylesheet"/>
</head>
<body>
<div class="st">
    Hello Weblogic!!!
</div>

</body>
</html>

src/main/resources/static/css/style。css

.st{
    color: red;
    font-size: 35px;
}

然后…

src/main/java/com/weblogic/weblogic/mvc/config/MyMvcConfig。JAVA

package com.weblogic.weblogic.mvc.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler(
                "/static/css/**",
                "/templates/pages/**")
                .addResourceLocations(
                        "classpath:/",
                        "classpath:/static/css/",
                        "classpath:/templates/pages/");
    }
}

但我得到…错误500——内部服务器错误java。weblogic上的lang.NullPointerException。servlet。内部的ServletResponseImpl。weblogic上的sendContentError(ServletResponseImpl.java:738)。servlet。内部的ServletResponseImpl。weblogic上的sendError(ServletResponseImpl.java:796)。servlet。内部的ServletResponseImpl。org上的sendError(ServletResponseImpl.java:713)。springframework。靴子网状物servlet。支持ErrorPageFilter$ErrorWrapperResponse。SendErrorIfEssential(ErrorPageFilter.java:349)位于org。springframework。靴子网状物servlet。支持ErrorPageFilter$ErrorWrapperResponse。getWriter(ErrorPageFilter.java:363)位于org。springframework。靴子自动配置。网状物servlet。错误ErrorMvcAutoConfiguration$StaticView。在org上呈现(ErrorMvcAutoConfiguration.java:227)。springframework。网状物servlet。调度员服务。render(DispatcherServlet.java:1373)位于org。springframework。网状物servlet。调度员服务。processDispatchResult(DispatcherServlet.java:1118)位于org。springframework。网状物servlet。调度员服务。doDispatch(DispatcherServlet.java:1057)位于org。springframework。网状物servlet。调度员服务。doService(DispatcherServlet.java:943)位于org。springframework。网状物servlet。FrameworkServlet。processRequest(FrameworkServlet.java:1006)

谁有办法解决这个问题?

共有1个答案

易弘阔
2023-03-14

您必须使用模板引擎-Thymeleaf。它不能以任何其他方式工作(我想使用纯(html引导),但不清楚如何配置它)。

  • 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>web.spring.boot.jar</groupId>
    <artifactId>web-spring-boot-jar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>web-spring-boot-jar</name>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

静态资源的结构

src/main/resources/static/css/style。css

src/main/resources/templates/index。html

src/main/resources/templates/pages/login/login。html

  • 属性

src/main/resources/application。属性

  • 这些设置不起作用
    spring.mvc.servlet.path=/api
    server.servlet.context-path=/api
    server.servlet.contextPath=/api

无法应用这些设置。

  • 配置文件-*。xml

src/main/webapp/WEB-INF/WEB。xml

   <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
            version="4.0">

   </web-app>

如果缺少此文件,则部署会发生错误(在开发环境中,您可以在控制台中看到)。

SRC/main/webapp/WEB-INF/weblogic.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app
            xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            https://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
            http://xmlns.oracle.com/weblogic/weblogic-web-app
            https://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd">

        <wls:context-root>rst</wls:context-root>
        <wls:container-descriptor>
            <wls:prefer-application-packages>
                <wls:package-name>org.slf4j</wls:package-name>
            </wls:prefer-application-packages>
        </wls:container-descriptor>
    </wls:weblogic-web-app>

        <wls:context-root>rst</wls:context-root>

在这里,在为应用程序的根上下文选择名称时需要小心(例如,如果为context-/web选择名称-

                             Entry point
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan

    public class WebSpringBootJarApplication extends SpringBootServletInitializer implements WebApplicationInitializer {

        public static void main(String[] args) {
            SpringApplication.run(WebSpringBootJarApplication.class, args);
        }

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(WebSpringBootJarApplication.class);
        }

    }

>

@启用自动配置

@ComponentScan

你必须有这3个注释,否则什么都不行。

文档中说@SpringBootConfiguration取代了注释:

@SpringBootConfiguration——表示该类提供了一个应用程序SpringBoot

它也可以用作@Configance注释的替代,因为配置可以自动找到。

@EnableAutoConfiguration——通过扫描类路径组件并注册匹配不同条件的bean,启用Spring ApplicationContext的自动配置。

也就是说,这个注释试图猜测和配置您可能需要的bean。

类的自动配置,通常基于应用程序的类路径和定义的bean应用。

>

@ComponentScan指令为标记为@Configuration的类配置组件扫描。使用元素中XML格式描述的配置并行提供支持:

...但是我甚至没有指定要扫描的包裹......

如果不指定这个注释,我也无法访问资源???

为什么?我不知道…

我需要什么来实现WebApplicationInitializer,-我不知道…

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-网络逻辑

  • 控制者

src/main/java/web/Spring/引导/jar/webspringbootjar/控制器/index/IndexController.java

>

@Controller
public class IndexController {

    @RequestMapping(value="/", method= RequestMethod.GET)
    public String index() {
        return "index";
    }
}

src/main/java/web/spring/boot/jar/webspringbootjar/controller/login/LoginController。JAVA

>

  • LoginController

    
    @Controller
    public class LoginController {
    
    
        @GetMapping(value = {"/log"})
        public ModelAndView showUsersPage() {
    
            return new ModelAndView("pages/login/login.html");
        }
    
    }
    
    

    工件的创建(Intellij Idea)-项目结构/工件-Alt Insert-Web应用程序:分解-

    您还可以配置-项目结构/方面

    然后…

    运行\编辑配置

    在这里您可以配置-weblogic…

    应用程序的URL(以我为例)http://localhost:7001/rst/

    当您从开发环境迁移.*war并将其部署到外部weblogic服务器时,将提供相同的访问权限。

    如果启动外部服务器,则会出现错误

    这意味着您需要运行maven,它必须生成一个*。战争档案…

    而且它不起作用。。。

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackageClasses = { ServletContextConfig.class })
    public class ServletContextConfig implements WebMvcConfigurer {
    
        @Bean
        public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
        webServerFactoryCustomizer() {
            return factory -> factory.setContextPath("/rootweb");
        }
    
    }
    
    
    • 我想我们只能在这里为servlet上下文使用xml配置。

    如果有人可以添加一些东西,请说明什么是错误的......

    谁能有什么想法,关于我在这条信息中出现的问题......

  •  类似资料:
    • 我有一个小型java webapp,由三个微服务组成——api-service、book-service和db-service,所有这些都使用mini kube本地部署在kubernetes集群上。 我计划为api-service和book-service保留单独的UI,从单独的pod提供常见的静态文件,可能是映像。 我能够创建一个前端,为参考本教程的nginx:alpine中的静态文件提供服务。

    • 我使用spring boot并将静态内容(html、css等)存储为。我理解不建议这样做,因为它不会存储在jar文件中(应该存储在、、、)。但我的问题不是关于在jar中存储静态内容。 这是项目结构: 如何从目标文件夹运行并让Spring Boot查找静态内容?它与类路径有关吗?我试图用选项指定类路径,但它不起作用。

    • 我有一个Spring Boot2.0应用程序,我试图将其部署为WAR文件。这意味着它将有一个自定义上下文路径。作为我添加的Java应用程序进行测试 不管我是否使用上下文路径,它总是试图从http://localhost:8080/dist/main.js加载文件,完全忽略我指定的上下文路径。如果我试图将我的应用程序部署为WAR也是如此。该文件实际上位于http://localhost:8080/m

    • 我正在使用Spring Boot,并试图使我的静态资源(CSS,JS,字体)在部署时可用。源代码可供您查看或从https://github.com/joecracko/StaticResourceError.克隆 现在我的CSS、JS和字体文件对我部署的网站不可见。 下面是我的项目目录结构: 下面是编译后的JAR的根目录:我向您保证,这些文件存在于各自的文件夹中。 以下是我看到的网络错误: 以下是

    • 首先,我不完全确定这是正确的问题。基本上,我的最终目标是生成一个可以操作一组。docx文件的程序,以便对每个文件进行小的更改。在我看来,docx4j是实现这一目标的最佳方式。但是,我从来没有使用过提供的库之外的库。我首先试图破译手册中提供的所有信息,然后告诉我需要SLF4J才能使用Docx4J。 从这一点来看,我想我做错了什么。我很确定我知道我想写的程序背后的伪逻辑,但我不确定如何写它。我还没有做

    • 假设我有一个包含以下内容的application.yml 从springboot开始,我就控制了Tomcat。有没有什么方法可以添加一个基本的html到它的根级别,这样我们的负载均衡器就不会标记我们的应用程序不可用?PD:我没有设置负载均衡器权限:(