IllegalArgumentException 在 Wildfly 14 上部署 CAS 5.3.10 Maven Overlay WAR
IllegalArgumentException deploying CAS 5.3.10 Maven Overlay WAR on Wildfly 14
我正在 Wildfly 14 上部署 CAS 5.3.10,使用 https://apereo.github.io/cas/5.3.x/installation/Configuring-Servlet-Container.html#external and using the project template at: https://github.com/apereo/cas-overlay-template/tree/5.3
中指定的 Maven Overlay
我已经编辑了在 Wildfly 9 上正确部署的 pom,但在 Wildfly 14 上部署失败,出现以下异常:
Caused by: java.lang.IllegalArgumentException: object is not an
instance of declaring class at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
org.springframework.core.io.VfsUtils.invokeVfsMethod(VfsUtils.java:100)
at org.springframework.core.io.VfsUtils.getFile(VfsUtils.java:172)
at
org.springframework.core.io.VfsResource.getFile(VfsResource.java:90)
at org.apereo.cas.util.CasVersion.getDateTime(CasVersion.java:59) at
org.apereo.cas.util.SystemUtils.getSystemInfo(SystemUtils.java:50)
...........
问题似乎与 CasVersion
class 试图通过 VFS(通过 spring)访问以检索与模块的最后修改日期相关的信息有关。
既然@Marco 没有提供他的修复,我会的。对于遇到相同问题的任何人,请按照以下步骤解决:
- 签出
cas-overlay-template
后,创建 CasVersion.java
在 src/main/java/org/apereo/cas/util
下,内容如下:
package org.apereo.cas.util;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.VfsResource;
import java.io.File;
import java.net.URL;
import java.time.ZonedDateTime;
/**
1. Class that exposes the CAS version. Fetches the "Implementation-Version"
2. manifest attribute from the jar file.
3. 4. @author Dmitriy Kopylenko
4. @since 3.0.0
*/
@Slf4j
@UtilityClass
public class CasVersion {
/**
* @return Return the full CAS version string.
* @see java.lang.Package#getImplementationVersion
*/
public static String getVersion() {
return CasVersion.class.getPackage().getImplementationVersion();
}
/**
* Gets specification version from the manifest package.
*
* @return the specification version
*/
public static String getSpecificationVersion() {
return CasVersion.class.getPackage().getSpecificationVersion();
}
/**
* Gets last modified date/time for the module.
*
* @return the date/time
*/
@SneakyThrows
public static ZonedDateTime getDateTime() {
final Class clazz = CasVersion.class;
final URL resource = clazz.getResource(clazz.getSimpleName() + ".class");
if ("file".equals(resource.getProtocol())) {
return DateTimeUtils.zonedDateTimeOf(new File(resource.toURI()).lastModified());
}
if ("jar".equals(resource.getProtocol())) {
final String path = resource.getPath();
final File file = new File(path.substring(5, path.indexOf('!')));
return DateTimeUtils.zonedDateTimeOf(file.lastModified());
}
// These lines are causing the reported exception so we just comment them out.
// if ("vfs".equals(resource.getProtocol())) {
// final File file = new VfsResource(resource.openConnection().getContent()).getFile();
// return DateTimeUtils.zonedDateTimeOf(file.lastModified());
// }
LOGGER.warn("Unhandled url protocol: [{}] resource: [{}]", resource.getProtocol(), resource);
return ZonedDateTime.now();
}
}
- 将以下依赖项添加到
pom.xml
<!-- Required for lombok imports -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
<scope>provided</scope>
</dependency>
<!-- Required for DateTimeUtils to be available on classpath -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-util</artifactId>
<version>${cas.version}</version>
</dependency>
- 将出现的任何
<app-server>-tomcat</app-server>
替换为 <app-server></app-server>
,因为您将提供应用程序服务器。
以上步骤应该足以解决报告的问题。
我正在 Wildfly 14 上部署 CAS 5.3.10,使用 https://apereo.github.io/cas/5.3.x/installation/Configuring-Servlet-Container.html#external and using the project template at: https://github.com/apereo/cas-overlay-template/tree/5.3
中指定的 Maven Overlay我已经编辑了在 Wildfly 9 上正确部署的 pom,但在 Wildfly 14 上部署失败,出现以下异常:
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.core.io.VfsUtils.invokeVfsMethod(VfsUtils.java:100) at org.springframework.core.io.VfsUtils.getFile(VfsUtils.java:172) at org.springframework.core.io.VfsResource.getFile(VfsResource.java:90) at org.apereo.cas.util.CasVersion.getDateTime(CasVersion.java:59) at org.apereo.cas.util.SystemUtils.getSystemInfo(SystemUtils.java:50) ...........
问题似乎与 CasVersion
class 试图通过 VFS(通过 spring)访问以检索与模块的最后修改日期相关的信息有关。
既然@Marco 没有提供他的修复,我会的。对于遇到相同问题的任何人,请按照以下步骤解决:
- 签出
cas-overlay-template
后,创建CasVersion.java
在src/main/java/org/apereo/cas/util
下,内容如下:
package org.apereo.cas.util;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.VfsResource;
import java.io.File;
import java.net.URL;
import java.time.ZonedDateTime;
/**
1. Class that exposes the CAS version. Fetches the "Implementation-Version"
2. manifest attribute from the jar file.
3. 4. @author Dmitriy Kopylenko
4. @since 3.0.0
*/
@Slf4j
@UtilityClass
public class CasVersion {
/**
* @return Return the full CAS version string.
* @see java.lang.Package#getImplementationVersion
*/
public static String getVersion() {
return CasVersion.class.getPackage().getImplementationVersion();
}
/**
* Gets specification version from the manifest package.
*
* @return the specification version
*/
public static String getSpecificationVersion() {
return CasVersion.class.getPackage().getSpecificationVersion();
}
/**
* Gets last modified date/time for the module.
*
* @return the date/time
*/
@SneakyThrows
public static ZonedDateTime getDateTime() {
final Class clazz = CasVersion.class;
final URL resource = clazz.getResource(clazz.getSimpleName() + ".class");
if ("file".equals(resource.getProtocol())) {
return DateTimeUtils.zonedDateTimeOf(new File(resource.toURI()).lastModified());
}
if ("jar".equals(resource.getProtocol())) {
final String path = resource.getPath();
final File file = new File(path.substring(5, path.indexOf('!')));
return DateTimeUtils.zonedDateTimeOf(file.lastModified());
}
// These lines are causing the reported exception so we just comment them out.
// if ("vfs".equals(resource.getProtocol())) {
// final File file = new VfsResource(resource.openConnection().getContent()).getFile();
// return DateTimeUtils.zonedDateTimeOf(file.lastModified());
// }
LOGGER.warn("Unhandled url protocol: [{}] resource: [{}]", resource.getProtocol(), resource);
return ZonedDateTime.now();
}
}
- 将以下依赖项添加到
pom.xml
<!-- Required for lombok imports -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
<scope>provided</scope>
</dependency>
<!-- Required for DateTimeUtils to be available on classpath -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-util</artifactId>
<version>${cas.version}</version>
</dependency>
- 将出现的任何
<app-server>-tomcat</app-server>
替换为<app-server></app-server>
,因为您将提供应用程序服务器。
以上步骤应该足以解决报告的问题。