springboot+struts打为jar包后允许找不到action 404问题

4 篇文章 0 订阅
4 篇文章 0 订阅

根本原因是struts扫描action时扫描不到,因为springboot达成jar包时,读取class文件时,前缀是/BOOT-INF/classes/,而struts的ClassFinder扫描时,只将war包形式的前缀 /WEB-INF/classes/ 前缀处理掉,没处理 /BOOT-INF/classes/ 前缀。

war包的类路径,前缀war包的类路径,前缀

要处理成这种,com…
要处理成这种,com....

jar包的类路径,前缀

请添加图片描述
修改点,处理类名全路径:

在这里插入图片描述

改造方式:

struts.xml 配置

<struts>
	...
	<!-- 自定义classFinderFactory -->
  <bean type="com.opensymphony.xwork2.util.finder.ClassFinderFactory" name="default" class="com.lii.pbs.bean.StrutsClassFinderFactory"/>
	...
</struts>

自定义 classFinderFactory

// 自定义classFinderFactory
public class StrutsClassFinderFactory implements ClassFinderFactory {

    @Override
    public ClassFinder buildClassFinder(ClassLoaderInterface classLoaderInterface, Collection<URL> collection, boolean b, Set<String> set,
        Test<String> test) {
        // 生成自定义 classFinder
        return new StrutsClassFinder(classLoaderInterface, collection, b, set, test);
    }
}

自定义 classFinder
暂时无法重载DefaultClassFinder 解决此问题,如有更好的方式,欢迎赐教。

/**
 * 解决打包为jar时,struts扫描class问题
 * 无法用重载方式解决,只能拷贝全部代码
 * 拷贝于 @see {@link org.apache.struts2.convention.DefaultClassFinder}
 * 只修改了 {@link #jar(JarInputStream jarStream)}
 *
 **/
public class StrutsClassFinder implements ClassFinder {
	...
	private List<String> jar(JarInputStream jarStream) throws IOException {
        List<String> classNames = new ArrayList<>();

        JarEntry entry;
        while ((entry = jarStream.getNextJarEntry()) != null) {
            if (entry.isDirectory() || !entry.getName().endsWith(".class")) {
                continue;
            }
            String className = entry.getName();
            className = className.replaceFirst(".class$", "");

            //war files are treated as .jar files, so takeout WEB-INF/classes
            className = StringUtils.removeStart(className, "WEB-INF/classes/");

			// 修改这里
            // 打包为jar时,className前缀为BOOT-INF/classes/,也要进行处理
            className = StringUtils.removeStart(className, "BOOT-INF/classes/");

            className = className.replace('/', '.');
            classNames.add(className);
        }

        return classNames;
    }
	...
}

ok,打包为jar包运行就可以了。
相关包
PackageBasedActionConfigBuilder

顺便记录下idea远程调试jar

此命令启动jar

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -jar xxx.jar

在Idea新增 Run/Debug Configurations
在这里插入图片描述
debug运行即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值