独立JavaEE应用服务器

独立JavaEE应用服务器,java,jakarta-ee,jetty,application-server,Java,Jakarta Ee,Jetty,Application Server,我正在开发独立的应用程序 应用程序像java-jarmyapp.jar一样启动,不部署在任何地方。我需要使用一个嵌入式应用服务器 到目前为止,我只找到了,但它不支持所有JavaEE特性。还有其他选择吗?查看spring boot项目: 它提供了使用嵌入式应用服务器构建可执行JAR的功能。Grizzly、Jetty、Tomcat和Undertow是可选方案。SpringBoot项目本身提供了各种额外的支持,例如内置的度量和开箱即用的健康检查。希望所提供的应用服务器之一能够满足您的需求 Under

我正在开发独立的应用程序

应用程序像
java-jarmyapp.jar一样启动,不部署在任何地方。我需要使用一个嵌入式应用服务器


到目前为止,我只找到了,但它不支持所有JavaEE特性。还有其他选择吗?

查看spring boot项目:

它提供了使用嵌入式应用服务器构建可执行JAR的功能。Grizzly、Jetty、Tomcat和Undertow是可选方案。SpringBoot项目本身提供了各种额外的支持,例如内置的度量和开箱即用的健康检查。希望所提供的应用服务器之一能够满足您的需求


Undertow()可能是一个完整的JavaEEServlet3.1容器,但我个人还没有使用过它。我参与的每个项目都认为Jetty和/或Tomcat是足够的。

我肯定会支持。基本上,它是一个有点j2ee类固醇的tomcat:p

=============

这些是代码,我在我本地的笔记本电脑上测试过,应该可以用。注意,您需要从这里下载tomee-embedded.jar,如果您想了解代码中到底发生了什么,还可以在中找到嵌入式jar的源代码

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

import javax.ejb.embeddable.EJBContainer;

import org.apache.openejb.loader.IO;
import org.apache.tomee.embedded.EmbeddedTomEEContainer;


public class Main {

    public static void main(String[] args) {
    EJBContainer container = null;
    try {
        System.out.println("Start");
        final File war = createWar();
            final Properties p = new Properties();
            p.setProperty(EJBContainer.APP_NAME, "test");
            p.setProperty(EJBContainer.PROVIDER, EmbeddedTomEEContainer.class.getName());
            p.put(EJBContainer.MODULES, war.getAbsolutePath());
            p.setProperty(EmbeddedTomEEContainer.TOMEE_EJBCONTAINER_HTTP_PORT, "-1");

            System.out.println(war.getAbsolutePath());

            container = EJBContainer.createEJBContainer(p);
            System.out.println(container);
            System.out.println(container.getContext());
            final URL url = new URL("http://127.0.0.1:" + System.getProperty(EmbeddedTomEEContainer.TOMEE_EJBCONTAINER_HTTP_PORT) + "/test/index.html");
            System.out.println(getOk(url, 2));

        } catch (Throwable e) {
            System.err.println(e.getLocalizedMessage());
        e.printStackTrace();
    } finally {

            if (container != null) {
                container.close();
            }
        }
    }
    private static String getOk(final URL url, final int tries) throws Exception {
        try {
            return IO.readProperties(url).getProperty("ok");
        } catch (final IOException e) {
            if (tries > 0) {
                Thread.sleep(1000);
                return getOk(url, tries - 1);
            } else {
                throw e;
            }
        }
    }

    private static File createWar() throws IOException {
        final File file = new File(System.getProperty("java.io.tmpdir") + "/tomee-" + Math.random());
        if (!file.mkdirs() && !file.exists()) {
            throw new RuntimeException("can't create " + file.getAbsolutePath());
        }

        write("ok=true", new File(file, "index.html"));
        write("<beans />", new File(file, "WEB-INF/classes/META-INF/beans.xml"));
        return file;
    }

    private static void write(final String content, final File file) throws IOException {
        if (!file.getParentFile().mkdirs() && !file.getParentFile().exists()) {
            throw new RuntimeException("can't create " + file.getParent());
        }

        final FileWriter index = new FileWriter(file);
        index.write(content);
        index.close();
    }
}
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.net.URL;
导入java.util.Properties;
导入javax.ejb.embeddeble.EJBContainer;
导入org.apache.openejb.loader.IO;
导入org.apache.tomee.embedded.embeddedTomeContainer;
公共班机{
公共静态void main(字符串[]args){
EJBContainer容器=null;
试一试{
系统输出打印项次(“开始”);
最终文件war=createWar();
最终属性p=新属性();
p、 setProperty(EJBContainer.APP_名称,“测试”);
p、 setProperty(EJBContainer.PROVIDER,EmbeddedTomeContainer.class.getName());
p、 put(EJBContainer.MODULES,war.getAbsolutePath());
p、 setProperty(EmbeddedTomeContainer.TOMEE_EJBCONTAINER_HTTP_端口,“-1”);
System.out.println(war.getAbsolutePath());
container=EJBContainer.createEJBContainer(p);
系统输出打印LN(容器);
System.out.println(container.getContext());
最终URL=新URL(“http://127.0.0.1:“+System.getProperty(EmbeddedTomeContainer.TOMEE_EJBCONTAINER_HTTP_PORT)+”“/test/index.html”);
System.out.println(getOk(url,2));
}捕获(可丢弃的e){
System.err.println(e.getLocalizedMessage());
e、 printStackTrace();
}最后{
if(容器!=null){
container.close();
}
}
}
私有静态字符串getOk(最终URL,最终整数尝试)引发异常{
试一试{
返回IO.readProperties(url.getProperty(“ok”);
}捕获(最终IOE例外){
如果(尝试>0){
睡眠(1000);
返回getOk(url,trys-1);
}否则{
投掷e;
}
}
}
私有静态文件createWar()引发IOException{
final File File=新文件(System.getProperty(“java.io.tmpdir”)+“/tomee-“+Math.random());
如果(!file.mkdirs()&&!file.exists()){
抛出新的RuntimeException(“无法创建”+file.getAbsolutePath());
}
写入(“ok=true”,新文件(文件,“index.html”);
写入(“,新文件(文件“WEB-INF/classes/META-INF/beans.xml”);
返回文件;
}
私有静态无效写入(最终字符串内容、最终文件)引发IOException{
如果(!file.getParentFile().mkdirs()&&!file.getParentFile().exists()){
抛出新的RuntimeException(“无法创建”+file.getParent());
}
最终FileWriter索引=新FileWriter(文件);
索引。写入(内容);
index.close();
}
}

我试图找到任何类似jetty的tomee嵌入式示例,但找不到:(稍后,我将尝试用如何运行tomee embedded的代码更新答案。到目前为止,也许你可以看到这一点。关键在于方法deployPathsAsWebapp();)jetty有一个模块,提供与tomee相同的Java EE层。然而,它不是一个非常流行的模块(总下载量不到200次)。