Java 如何将Web服务器嵌入CAS webapp版本
我曾尝试运行CAS webapp,例如可执行WAR,最初我发现了两种可能的解决方案。但是有更好的解决办法吗 1) 创建一个主类来启动Jetty嵌入式服务器和运行CAS war文件Java 如何将Web服务器嵌入CAS webapp版本,java,jetty,maven-3,cas,embedded-jetty,Java,Jetty,Maven 3,Cas,Embedded Jetty,我曾尝试运行CAS webapp,例如可执行WAR,最初我发现了两种可能的解决方案。但是有更好的解决办法吗 1) 创建一个主类来启动Jetty嵌入式服务器和运行CAS war文件 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.tomcat.InstanceManager; import org.apache
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.tomcat.InstanceManager;
import org.apache.tomcat.SimpleInstanceManager;
import org.eclipse.jetty.annotations.ServletContainerInitializersStarter;
import org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
import org.eclipse.jetty.plus.annotation.ContainerInitializer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.h2.jdbcx.JdbcDataSource;
public class CasServerEmbedded {
public static void main(String[] args) throws Exception {
// Create the server
Server server = new Server(8080);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList
.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
// Create a WebApp
final WebAppContext webAppContext = new WebAppContext();
webAppContext.setAttribute("javax.servlet.context.tempdir", getScratchDir());
webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/.*taglibs.*\\.jar$");
webAppContext.setAttribute("org.eclipse.jetty.containerInitializers", jspInitializers());
webAppContext.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager());
webAppContext.addBean(new ServletContainerInitializersStarter(webAppContext), true);
webAppContext.setWar("C:\\temp\\cas-server-webapp-4.2.1.war");
server.setHandler(webAppContext);
final JdbcDataSource jdbcDataSource = new JdbcDataSource();
jdbcDataSource.setURL("jdbc:h2:c:\\temp\\teste;mv_store=false");
jdbcDataSource.setUser("sa");
jdbcDataSource.setPassword("sa");
jdbcDataSource.getConnection();
new org.eclipse.jetty.plus.jndi.Resource(webAppContext, "jdbc/mydatasource", jdbcDataSource);
server.start();
server.join();
}
/**
* Establish Scratch directory for the servlet context (used by JSP
* compilation)
*/
private static File getScratchDir() throws IOException {
File tempDir = new File(System.getProperty("java.io.tmpdir"));
File scratchDir = new File(tempDir.toString(), "embedded-jetty-jsp");
if (!scratchDir.exists()) {
if (!scratchDir.mkdirs()) {
throw new IOException("Unable to create scratch directory: " + scratchDir);
}
}
return scratchDir;
}
/**
* Ensure the jsp engine is initialized correctly
*/
private static List<ContainerInitializer> jspInitializers() {
JettyJasperInitializer sci = new JettyJasperInitializer();
ContainerInitializer initializer = new ContainerInitializer(sci, null);
List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>();
initializers.add(initializer);
return initializers;
}
}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.tomcat.InstanceManager;
导入org.apache.tomcat.SimpleInstanceManager;
导入org.eclipse.jetty.annotations.ServletContainerInitializersStarter;
导入org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
导入org.eclipse.jetty.plus.annotation.ContainerInitializer;
导入org.eclipse.jetty.server.server;
导入org.eclipse.jetty.webapp.WebAppContext;
导入org.h2.jdbcx.JdbcDataSource;
公共类CasServerEmbedded{
公共静态void main(字符串[]args)引发异常{
//创建服务器
服务器=新服务器(8080);
//启用对web.xml和jetty-env.xml的jndi相关部分的解析
org.eclipse.jetty.webapp.Configuration.ClassList ClassList=org.eclipse.jetty.webapp.Configuration.ClassList
.setServerDefault(服务器);
classlist.addAfter(“org.eclipse.jetty.webapp.FragmentConfiguration”,
“org.eclipse.jetty.plus.webapp.EnvConfiguration”、“org.eclipse.jetty.plus.webapp.PlusConfiguration”);
//创建一个WebApp
final WebAppContext WebAppContext=新WebAppContext();
setAttribute(“javax.servlet.context.tempdir”,getScratchDir());
webAppContext.setAttribute(“org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern”,
“*/[^/]*servlet api-[^/]*\\.jar$\\.*/javax.servlet.jsp.jstl-.\\\\.jar$\\.*/*taglibs.\\\.jar$”;
webAppContext.setAttribute(“org.eclipse.jetty.containerInitializers”,jspinInitializers());
webAppContext.setAttribute(InstanceManager.class.getName(),新的SimpleInstanceManager());
addBean(新的ServletContainerInitializersStarter(webAppContext),true);
webAppContext.setWar(“C:\\temp\\cas-server-webapp-4.2.1.war”);
setHandler(webAppContext);
final JdbcDataSource JdbcDataSource=新JdbcDataSource();
setURL(“jdbc:h2:c:\\temp\\teste;mv_store=false”);
setUser(“sa”);
设置密码(“sa”);
jdbcDataSource.getConnection();
新的org.eclipse.jetty.plus.jndi.Resource(webAppContext,“jdbc/mydatasource”,jdbcDataSource);
server.start();
join();
}
/**
*为servlet上下文(由JSP使用)建立临时目录
*(汇编)
*/
私有静态文件getScratchDir()引发IOException{
File tempDir=新文件(System.getProperty(“java.io.tmpdir”);
File scratchDir=新文件(tempDir.toString(),“嵌入式jetty jsp”);
如果(!scratchDir.exists()){
如果(!scratchDir.mkdirs()){
抛出新IOException(“无法创建临时目录:+scratchDir”);
}
}
返回scratchDir;
}
/**
*确保jsp引擎已正确初始化
*/
私有静态列表JSPIInitializers(){
JettyJasperillizer sci=新JettyJasperillizer();
ContainerInitializer初始值设定项=新的ContainerInitializer(sci,null);
列表初始值设定项=新的ArrayList();
初始值设定项。添加(初始值设定项);
返回初始值设定项;
}
}
2) 使用Maven,我可以执行目标jetty:runwar,它在jetty嵌入式服务器中启动war覆盖
<?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.jasig.cas</groupId>
<artifactId>cas-overlay</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<properties>
<cas.version>4.2.1</cas.version>
<maven-jetty-plugin.version>9.3.6.v20151106</maven-jetty-plugin.version>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>${cas.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warName>cas</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
<overlays>
<overlay>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
</overlay>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${maven-jetty-plugin.version}</version>
<configuration>
<jettyXml>${basedir}/etc/jetty/jetty.xml</jettyXml>
<systemProperties>
<systemProperty>
<name>org.eclipse.jetty.annotations.maxWait</name>
<value>240</value>
</systemProperty>
</systemProperties>
<webApp>
<contextPath>/cas</contextPath>
<overrideDescriptor>${basedir}/etc/jetty/web.xml</overrideDescriptor>
</webApp>
<webAppConfig>
<allowDuplicateFragmentNames>true</allowDuplicateFragmentNames>
</webAppConfig>
<jvmArgs>-Dlog4j.configurationFile=/etc/cas/log4j2.xml -Xdebug
-Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n</jvmArgs>
</configuration>
</plugin>
</plugins>
<finalName>cas</finalName>
</build>
</project>
4.0.0
org.jasig.cas
cas覆盖
战争
1
4.2.1
9.3.6.v20151106
1.7
1.7
UTF-8
org.jasig.cas
cas服务器webapp
${cas.version}
战争
运行时
org.apache.maven.plugins
maven战争插件
2.6
中科院
假的
org.jasig.cas
cas服务器webapp
org.apache.maven.plugins
maven编译器插件
3.3
1.7
1.7
org.eclipse.jetty
jetty maven插件
${maven jetty plugin.version}
${basedir}/etc/jetty/jetty.xml
org.eclipse.jetty.annotations.maxWait
240
/中科院
${basedir}/etc/jetty/web.xml
真的
-Dlog4j.configurationFile=/etc/cas/log4j2.xml-Xdebug
-Xrunjdwp:transport=dt_套接字,地址=5000,服务器=y,挂起=n
中科院
正如您所看到的,这两种解决方案都将CAS启动到一个独立的web服务器中,但我试图实现Jenkins所做的,一个WAR文件,可以通过一个简单的命令行启动:java-jar CAS.WAR
有没有办法将Maven构建导出到通过Jetty embedded运行的WAR文件中
Tks,此行为由CAS v5和Spring Boot自动提供。不要重新发明轮子 此行为由CAS v5和Spring Boot自动提供。不要重新发明轮子 好的,但是我在哪里可以买到这个CAS 5版本?到目前为止,只有一个版本