使用 spring/spring boot/spring cloud 几年后。我决定从基础开始学习 Jakarta EE
我有 CXF 基本 JAXRS Web 服务,带有虚拟 api,可以通过 CLI 在本地工作
(
java -jar my-app.jar
)
但是,一旦我使用 docker-compose 部署它,请求就不会执行(失败)
API 请求是:
http://localhost:333/hello/persons
应返回:
[{"id":1,"name":"A"},{"id":1,"name":"B"}]
但是我在底部执行 docker-compose up docker-compose-yml 文件请求失败了
这是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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>cxf-jetty</artifactId>
<verson>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<apache.cxf.version>4.0.3</apache.cxf.version>
<jackson.version>2.16.0</jackson.version>
<jakarta-jws.version>3.0.0</jakarta-jws.version>
<jakarta-platform.version>9.0.0</jakarta-platform.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jakarta.rs</groupId>
<artifactId>jackson-jakarta-rs-json-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation=
"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.example.WebServer</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/bus-extensions.txt</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<finalName>my-app</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是主要功能和类:
package org.example;
import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import java.util.logging.Logger;
public class WebServer {
private static final Logger logger = Logger.getLogger(WebServer.class.getName());
public static void main(String[] args) throws InterruptedException {
logger.info("Starting server...");
JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setResourceClasses(SimpleController.class);
factoryBean.setProvider(new JacksonJsonProvider());
factoryBean.setAddress("http://localhost:333/");
Server server = factoryBean.create();
server.start();
Thread.currentThread().join();
}
}
这是虚拟 API
@Path("hello")
public class SimpleController {
@GET
@Path("persons")
@Produces(MediaType.APPLICATION_JSON)
public List<Person> getPersons() {
return List.of(new Person(1, "A"), new Person(1, "B"));
}
}
docker文件:
FROM alpine:edge
RUN apk add --no-cache openjdk17
RUN apk --no-cache add curl
EXPOSE 333
COPY target/my-app.jar /app/my-app.jar
WORKDIR /app
ENTRYPOINT ["java","-jar","my-app.jar"]
撰写文件
version: "3.9"
services:
my-app:
restart: always
container_name: my-app
build: my-app
ports:
- "333:333"
networks:
- app-network
networks:
app-network:
external: false
name: app-network
发现问题
factoryBean.setAddress("http://localhost:333/");
-->factoryBean.setAddress("http://0.0.0.0:333/");