独立 Java EE 应用程序服务器
Standalone Java EE Application Server
我正在开发独立应用程序。
应用程序像 java -jar myapp.jar
一样启动,并且没有部署到任何地方。我需要使用可嵌入的应用程序服务器。
到目前为止我只找到 Jetty,但它不支持所有 Java EE 功能。还有其他选择吗?
查看 spring-boot 项目:
http://projects.spring.io/spring-boot/
它提供了使用嵌入式应用程序服务器构建可执行 jar 的功能。 Grizzly、Jetty、Tomcat 和 Undertow 是选项。 spring-boot 项目本身提供了各种额外的支持,例如开箱即用的内置指标和健康检查。希望提供的应用程序服务器之一能够满足您的需求。
Undertow (http://undertow.io/) 应该是一个完整的 Java EE servlet 3.1 容器,但我还没有亲自使用过它。我从事的每个项目都发现 Jetty and/or Tomcat 就足够了。
我肯定会选择 tomee。基本上它是 tomcat 有点 j2ee 的类固醇 :p
=============
这些是代码,我在本地笔记本电脑上对其进行了测试,它应该可以工作。请注意,如果您想了解代码中究竟发生了什么,您需要从此 link and also the source code for the embedded jar can be found in here 下载 tomee-embedded.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 -jar myapp.jar
一样启动,并且没有部署到任何地方。我需要使用可嵌入的应用程序服务器。
到目前为止我只找到 Jetty,但它不支持所有 Java EE 功能。还有其他选择吗?
查看 spring-boot 项目:
http://projects.spring.io/spring-boot/
它提供了使用嵌入式应用程序服务器构建可执行 jar 的功能。 Grizzly、Jetty、Tomcat 和 Undertow 是选项。 spring-boot 项目本身提供了各种额外的支持,例如开箱即用的内置指标和健康检查。希望提供的应用程序服务器之一能够满足您的需求。
Undertow (http://undertow.io/) 应该是一个完整的 Java EE servlet 3.1 容器,但我还没有亲自使用过它。我从事的每个项目都发现 Jetty and/or Tomcat 就足够了。
我肯定会选择 tomee。基本上它是 tomcat 有点 j2ee 的类固醇 :p
=============
这些是代码,我在本地笔记本电脑上对其进行了测试,它应该可以工作。请注意,如果您想了解代码中究竟发生了什么,您需要从此 link and also the source code for the embedded jar can be found in here 下载 tomee-embedded.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();
}
}