我有一个用例,需要我从应用程序中控制 Glassfish 服务器上的应用程序的部署(除其他外)。
是否可以在 glassfish 服务器上使用一个应用程序来部署和控制同一 glassfish 服务器上的其他应用程序?
我有一个用例,需要我从应用程序中控制 Glassfish 服务器上的应用程序的部署(除其他外)。
是否可以在 glassfish 服务器上使用一个应用程序来部署和控制同一 glassfish 服务器上的其他应用程序?
虽然 glassfish 可以独立启动,但它也可以嵌入到您自己的应用程序中(这里不要认为 Java EE,而是简单(或不那么简单)的 Java 应用程序)。
您可以定义一组管理 API,启动和配置 GlassFish,并通过这些 API管理该 glassfish 实例。将您的 API 暴露给在 glassfish 下运行的应用程序也应该是可行的。
我认为在 glassfish 中自动部署应用程序的最简单方法是使用 glassfish 的 autodeploy 文件夹(位于 glassfish\domains\autodeploy 中)。您复制到该文件夹的每个 war 或 jar 都将自动部署在服务器中(如果它工作正常)。
因此,您需要做的就是使用 Quartz 之类的计划控件和几种方法来复制服务器中的文件(例如,复制到您的工作目录到 autodeploy 文件夹)。
另一种选择是在您的应用程序中运行 shell 脚本,如下所示
$ ./asadmin deploy --name \ --contextroot /absolute/path/to/.war
我相信基本的 Glassfish 服务器管理可以使用 JSR88 API 来处理。尽管这些 API 在 Java EE 7 中被标记为可选,但它们可以工作。我认为您可以在 Java SE 和 EE 应用程序中使用这些 API。
这里有可用的包装 API ,您可以使用它们来操作所有主要的 Java EE 容器。这些 API 也使用 JSR88。
这里有一个示例代码可用于部署/取消部署 Java EE 应用程序。此示例适用于某些较旧版本的 Glassfish(可能是 Glassfish2x)。
我稍微修改了示例代码以使其与我在此处发布的 Glassfish4x 一起工作:
package simplewardeployer;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
import javax.enterprise.deploy.spi.exceptions.TargetException;
import javax.enterprise.deploy.spi.factories.DeploymentFactory;
import javax.enterprise.deploy.spi.status.ProgressEvent;
import javax.enterprise.deploy.spi.status.ProgressListener;
import javax.enterprise.deploy.spi.status.ProgressObject;
public class Main {
class DeploymentListener implements ProgressListener {
Main driver;
String warContext;
DeploymentListener(Main driver, String warContext) {
this.driver = driver;
this.warContext = warContext;
}
public void handleProgressEvent(ProgressEvent event) {
System.out.println(event.getDeploymentStatus().getMessage());
if (event.getDeploymentStatus().isCompleted()) {
try {
TargetModuleID[] ids = getDeploymentManager().getNonRunningModules(ModuleType.WAR, getDeploymentManager().getTargets());
TargetModuleID[] myIDs = new TargetModuleID[1];
for (TargetModuleID id : ids) {
if (warContext.equals(id.getModuleID())) {
myIDs[0] = id;
ProgressObject startProgress = driver.getDeploymentManager().start(myIDs);
startProgress.addProgressListener(new ProgressListener() {
public void handleProgressEvent(ProgressEvent event) {
System.out.println(event.getDeploymentStatus().getMessage());
if (event.getDeploymentStatus().isCompleted()) {
driver.setAppStarted(true);
}
}
});
}
}
} catch (IllegalStateException ex) {
ex.printStackTrace();
} catch (TargetException ex) {
ex.printStackTrace();
}
}
}
}
DeploymentManager deploymentManager;
boolean appStarted;
boolean appUndeployed;
String warContext;
String warFilename;
String wsdlUrl;
synchronized void setAppStarted(boolean appStarted) {
this.appStarted = appStarted;
notifyAll();
}
synchronized void setAppUndeployed(boolean appUndeployed) {
this.appUndeployed = appUndeployed;
notifyAll();
}
private String getParam(String param) {
return (null == deploymentProperties) ? null : deploymentProperties.getProperty(param);
}
public DeploymentManager getDeploymentManager() {
if (null == deploymentManager) {
DeploymentFactoryManager dfm = DeploymentFactoryManager.getInstance();
try {
Class dfClass = Class.forName(getParam("jsr88.df.classname"));
DeploymentFactory dfInstance;
dfInstance = (DeploymentFactory) dfClass.newInstance();
dfm.registerDeploymentFactory(dfInstance);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
}
try {
deploymentManager
= dfm.getDeploymentManager(
getParam("jsr88.dm.id"), getParam("jsr88.dm.user"), getParam("jsr88.dm.passwd"));
} catch (DeploymentManagerCreationException ex) {
ex.printStackTrace();
}
}
return deploymentManager;
}
TargetModuleID getDeployedModuleId(String warContext) {
TargetModuleID foundId= null;
TargetModuleID[] ids = null;
try {
ids = getDeploymentManager().getAvailableModules(ModuleType.WAR, getDeploymentManager().getTargets());
for (TargetModuleID id : ids) {
if (warContext.equals(id.getModuleID())) {
foundId = id;
break;
}
}
} catch (TargetException | IllegalStateException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
return foundId;
}
void runApp(String warFilename, String warContext) {
setAppStarted(false);
ProgressObject deplProgress;
TargetModuleID foundId = getDeployedModuleId(warContext);
if (foundId != null) {
TargetModuleID[] myIDs = new TargetModuleID[1];
myIDs[0] = foundId;
deplProgress = getDeploymentManager().redeploy(myIDs, new File(warFilename), null);
} else {
deplProgress = getDeploymentManager().distribute(getDeploymentManager().getTargets(),
new File(warFilename), null);
}
if (deplProgress != null) {
deplProgress.addProgressListener(new DeploymentListener(this, warContext));
waitForAppStart();
}
}
void undeployApp(String warContext) {
setAppUndeployed(false);
try {
TargetModuleID[] ids = getDeploymentManager().getRunningModules(ModuleType.WAR, getDeploymentManager().getTargets());
TargetModuleID[] myIDs = new TargetModuleID[1];
for (TargetModuleID id : ids) {
if (warContext.equals(id.getModuleID())) {
myIDs[0] = id;
ProgressObject startProgress = getDeploymentManager().undeploy(myIDs);
startProgress.addProgressListener(new ProgressListener() {
public void handleProgressEvent(ProgressEvent event) {
System.out.println(event.getDeploymentStatus().getMessage());
if (event.getDeploymentStatus().isCompleted()) {
setAppUndeployed(true);
}
}
});
}
}
} catch (IllegalStateException ex) {
ex.printStackTrace();
} catch (TargetException ex) {
ex.printStackTrace();
}
waitForAppUndeployment();
}
void releaseDeploymentManager() {
if (null != deploymentManager) {
deploymentManager.release();
}
}
synchronized void waitForAppStart() {
while (!appStarted) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
synchronized void waitForAppUndeployment() {
while (!appUndeployed) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
public Main() {
}
public Main(String filename) {
setProperties(filename);
}
private final static String SyntaxHelp = "syntax:\\n\\tdeploy \\n\\tundeploy ";
private final static String PropertiesFilename = "wardeployment.properties";
private Properties deploymentProperties;
private void setProperties(String filename) {
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
deploymentProperties = new Properties();
deploymentProperties.load(fis);
fis.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private static void printHelpAndExit() {
System.out.println(SyntaxHelp);
System.exit(1);
}
public static void main(String[] args) {
if (args.length < 1) {
printHelpAndExit();
}
Main worker = new Main(PropertiesFilename);
if ("deploy".equals(args[0])) {
System.out.println("Deploying app...");
String warContext = new File(args[1]).getName();
warContext = warContext.substring(0, warContext.length() - 4);
worker.runApp(args[1], warContext);
worker.releaseDeploymentManager();
} else if ("undeploy".equals(args[0])) {
System.out.println("Undeploying app...");
String warContext = new File(args[1]).getName();
warContext = warContext.substring(0, warContext.lastIndexOf("."));
worker.undeployApp(warContext);
worker.releaseDeploymentManager();
}
}
}
修改后的wardeployment.properties
文件如下:
jsr88.dm.id=deployer:Sun:AppServer::10.9.80.117:4848
jsr88.dm.user=admin
jsr88.dm.passwd=adminadmin
jsr88.df.classname=org.glassfish.deployapi.SunDeploymentFactory
您需要在类路径中添加javaee-api-7.0.jar
和development-client.jar
文件。您可以development-client.jar
在“glassfish-4.0\glassfish\modules\”目录下的 glassfish 安装目录中找到。
更新:我从 Netbeans 7.4 测试了该应用程序,它在 IDE 中运行,但是在 IDE 之外它生成了一条错误消息,该错误消息不容易修复,因为不知道问题出在哪里。错误消息是
javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException:无法获取 DeploymentManager
根本原因是缺少一些必需的库。在浏览了 glassfish 库的整个列表后,我发现如果我们想独立运行应用程序,则需要以下库。在下面找到完整列表: