我正在尝试运行Java独立应用程序作为IBMCloud函数中的docker映像。
Java代码:
import com.google.gson.JsonObject;
public class Hello {
public static JsonObject main(JsonObject args) {
String name = "stranger";
if (args.has("name"))
name = args.getAsJsonPrimitive("name").getAsString();
JsonObject response = new JsonObject();
response.addProperty("greeting", "Hello, " + name + "!");
return response;
}
public static void main(String...strings) {
String name = "stranger";
JsonObject response = new JsonObject();
if(strings.length > 0)
name = strings[0];
response.addProperty("greeting", "Hello, " + name + "!");
System.out.println(response);
}
}
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.qs</groupId>
<artifactId>qs-action</artifactId>
<version>1.0.0</version>
<name>java-action</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
<!-- <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> -->
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.qs.Hello</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Docker文件:
FROM java:8
#ADD ./target/qs-action-1.0.0.jar /qs-action-1.0.0.jar
ADD ./target/qs-action-1.0.0-jar-with-dependencies.jar /qs-action-1.0.0-jar-with-dependencies.jar
ADD ./run.sh /run.sh
RUN chmod a+x /run.sh
CMD /run.sh
run.sh:
java -jar /qs-action-1.0.0-jar-with-dependencies.jar
我能够在一个可执行的jar中构建和编译项目。现在,在这之后,我使用命令来构建docker映像
docker build -t dockerrepo/imagename:tag .
在构建图像并运行docker run imageid
之后,显示java主方法的结果。如:CCD_ 2。在将图像推送到dockerhub之后,我正在创建一个云功能:ibmcloud-fn-create-action jaction--docker docker repo/image:tag--main com.qs.Hello,因此创建了ibm action。在这之后,我试图通过UI和命令行调用它,但错误被抛出。
ok:调用/_/jaction,但请求尚未完成,id为XXXXXXXX。
当我运行IBM云操作UI时,主方法响应显示在日志中,但不返回任何json响应字符串。
你们中有谁能帮我解决这个问题吗。
您似乎在混合基于Java的操作和基于Docker的操作。两者都是通过CLI部署的,有关选项的详细信息,请参阅有关创建操作的CLI参考。
在部署Java操作时,需要识别方法名称。当它是Docker镜像时,您需要指定应用程序或脚本:
--main ENTRY_METHOD_NAME
如果操作的输入方法不是main,请指定自定义名称。当输入方法不是主要的。对于某些运行时,例如Java,名称必须是完全合格的方法。
在您提供的详细信息中,似乎您指定了方法,但需要指向脚本run.sh.