Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

春松客服 Windows开发时,使用 IDEA,启动后报错 Illegal char <:> at index 9: classpath:/templates/ #408

Closed
MQPearth opened this issue Feb 23, 2021 · 31 comments
Assignees
Labels

Comments

@MQPearth
Copy link

描述

java.nio.file.InvalidPathException: Illegal char <:> at index 9: classpath:/templates/

http://localhost:8035/login.html 访问页面后报错

完整堆栈

java.nio.file.InvalidPathException: Illegal char <:> at index 9: classpath:/templates/
	at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
	at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
	at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
	at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
	at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
	at java.nio.file.Paths.get(Paths.java:84)
	at de.neuland.pug4j.spring.template.SpringTemplateLoader.getResourceName(SpringTemplateLoader.java:58)
	at de.neuland.pug4j.spring.template.SpringTemplateLoader.getResource(SpringTemplateLoader.java:46)
	at de.neuland.pug4j.spring.template.SpringTemplateLoader.getReader(SpringTemplateLoader.java:36)
	at de.neuland.pug4j.PugConfiguration.templateExists(PugConfiguration.java:178)
	at de.neuland.pug4j.spring.view.PugView.checkResource(PugView.java:71)
	at org.springframework.web.servlet.view.UrlBasedViewResolver.loadView(UrlBasedViewResolver.java:510)
	at org.springframework.web.servlet.view.AbstractCachingViewResolver.createView(AbstractCachingViewResolver.java:244)
	at org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:473)
	at org.springframework.web.servlet.view.AbstractCachingViewResolver.resolveViewName(AbstractCachingViewResolver.java:156)
	at org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1325)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1263)
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.chatopera.cc.config.ApiRequestMatchingFilter.doFilter(ApiRequestMatchingFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.chatopera.cc.config.DelegateRequestMatchingFilter.doFilter(DelegateRequestMatchingFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:208)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:171)
	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at io.micrometer.spring.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:679)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
@hailiang-wang
Copy link
Member

提供:部署方式,是在开发环境还是 Chatopera 提供的 docker 容器服务,使用 docker-compose 部署。
如果是自己的开发环境,提供 JDK 和操作系统的类型,版本。

@hailiang-wang hailiang-wang self-assigned this Feb 23, 2021
@hailiang-wang
Copy link
Member

看错误日志,是在 Windows 上开发?使用了什么 IDE 工具?

@MQPearth
Copy link
Author

@hailiang-wang
开发环境, windows10 2004, jdk 1.8.0_171 , ide: idea2020.2

@hailiang-wang
Copy link
Member

@mukaiu 是因为 de.neuland.pug4j.spring.template.SpringTemplateLoader.getResourceName 对 classpath 支持的问题?
或者是春松客服的代码的问题。帮忙看一下。

java.nio.file.InvalidPathException: Illegal char <:> at index 9: classpath:/templates/
	at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
	at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
	at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
	at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
	at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
	at java.nio.file.Paths.get(Paths.java:84)
	at de.neuland.pug4j.spring.template.SpringTemplateLoader.getResourceName(SpringTemplateLoader.java:58)

@hailiang-wang
Copy link
Member

开发环境的搭建和项目启动的过程,和开发者文档描述一致吗?

https://docs.chatopera.com/products/cskefu/osc/engineering.html

请介绍一下项目启动过程。
因为我们的开发环境 Mac, 生产环境 Linux,Docker;所以对 Windows 上开发支持有限,请详细描述,我们再进行支持,感谢!

@hailiang-wang
Copy link
Member

@MQPearth
Copy link
Author

@hailiang-wang 是一样的, 完全一样的项目, 在Mac上能运行

@hailiang-wang hailiang-wang changed the title Illegal char <:> at index 9: classpath:/templates/ Windows开发时,使用 IDEA,启动后报错 Illegal char <:> at index 9: classpath:/templates/ Feb 24, 2021
@SkorpiosL
Copy link

碰到了同样的问题,目前有什么解决方案吗

@cskefu cskefu deleted a comment from SkorpiosL Mar 4, 2021
@hailiang-wang
Copy link
Member

目前只是分析了原因,我们研发同事目前都是 Mac 开发环境,作为开源项目,您可以自己解决,春松客服团队估计在 4 月份可以对 Windows 开发环境完成兼容。

@MQPearth

This comment has been minimized.

@understanding
Copy link

遇到同样问题

@hailiang-wang
Copy link
Member

出问题的地方
return FileSystems.getDefault().getPath(first, more)

解决方案:直接测试这段代码

@configuration
public class PugConfig {
@value("${spring.pug4j.cache}")
private Boolean pug4jCache;

@Value("${spring.pug4j.template-loader-path}")
private String templatePath;

public static void main(String[] args) {
    try {
        String str = getPath("classpath:/templates/");
        System.out.println(str);
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}
public static String getPath(String templatePath) throws URISyntaxException {
    String path = "";
    String classpathStr = "classpath:";
    if(templatePath.indexOf("classpath:") ==0){
        // String classPath =PugConfig.class.getResource("").getPath();
        path =PugConfig.class.getResource("/").getPath();
        path =path.replace("%20", " ");

        File file =new File(path);
        String classPath = file.getAbsolutePath();
        templatePath = templatePath.substring(classpathStr.length());
        path = FileSystems.getDefault().getPath(classPath,templatePath).toString();
    }else {
        path = templatePath;
    }

    return path;
}
@Bean
public SpringTemplateLoader templateLoader(){
    SpringTemplateLoader templateLoader = new SpringTemplateLoader();
    try {
        templateLoader.setTemplateLoaderPath(getPath(templatePath));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    templateLoader.setEncoding("UTF-8");
    templateLoader.setSuffix(".pug");
    return templateLoader;
}

感谢建议,该方法测试后还是没有解决问题!
欢迎提 PR 帮助解决!

@hailiang-wang
Copy link
Member

@viaco2ove
现在 Owner 设置为你了,期待 PR,感谢!
因为我们目前没有人在 Windows 上开发,支持 Windows 上成本比较高,社区朋友正好再用 Windows 就好了。

如果需要更新 Pug4j 的插件代码,也是可以的,我们可以发布到
https://nexus.chatopera.com/

@xl111
Copy link

xl111 commented May 8, 2021

按照这个尝试了,还是有问题,有人成功吗 分享加经验 谢谢
PugConfig:

public static String getServletPath(String templatePath) throws URISyntaxException {
String path = "";
String classpathStr = "classpath:";
if(templatePath.indexOf("classpath:") ==0){
templatePath = templatePath.substring(classpathStr.length());

// if (templatePath.substring(0,1).equals("/") ){
// path = templatePath.substring(1);
// }
path = templatePath;
}else {
path = templatePath;
}

    return path;
}

@Bean
public SpringTemplateLoader templateLoader(){
    SpringTemplateLoader templateLoader = new SpringTemplateLoader();
    try {
        templateLoader.setTemplateLoaderPath(getServletPath(templatePath));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    templateLoader.setEncoding("UTF-8");
    templateLoader.setSuffix(".pug");
    //templateLoader.setBase(File.separator)
    return templateLoader;
}

引入 pug4j v2.0.0 alpha 3源码,问题解决。我引入的是master

SpringTemplateLoader 最新修改方案:

PugConfig 改为官方的代码(其实我加多了一个控制变量,跳过Resource 和不跳过Resource)

SpringTemplateLoader 中 改为这个

private String getResourceName(String name){
    if(!StringUtils.isBlank(templateLoaderPath))
        if(Paths.get(name).isAbsolute()) {
            return Paths.get(templateLoaderPath+ base +name.substring(1)).toString();
        }else {
            //return Paths.get(templateLoaderPath).resolve(name).toString();
             return templateLoaderPath + name ;
        }
    else {
        return name;
    }
}

@xl111
Copy link

xl111 commented May 8, 2021 via email

@xl111
Copy link

xl111 commented May 8, 2021 via email

@viaco2ove
Copy link

按照这个尝试了,还是有问题,有人成功吗 分享加经验 谢谢
PugConfig:

public static String getServletPath(String templatePath) throws URISyntaxException {
String path = "";
String classpathStr = "classpath:";
if(templatePath.indexOf("classpath:") ==0){
templatePath = templatePath.substring(classpathStr.length());

// if (templatePath.substring(0,1).equals("/") ){
// path = templatePath.substring(1);
// }
path = templatePath;
}else {
path = templatePath;
}

    return path;
}

@Bean
public SpringTemplateLoader templateLoader(){
    SpringTemplateLoader templateLoader = new SpringTemplateLoader();
    try {
        templateLoader.setTemplateLoaderPath(getServletPath(templatePath));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    templateLoader.setEncoding("UTF-8");
    templateLoader.setSuffix(".pug");
    //templateLoader.setBase(File.separator)
    return templateLoader;
}

引入 pug4j v2.0.0 alpha 3源码,问题解决。我引入的是master

SpringTemplateLoader 最新修改方案:

PugConfig 改为官方的代码(其实我加多了一个控制变量,跳过Resource 和不跳过Resource)

SpringTemplateLoader 中 改为这个

private String getResourceName(String name){
    if(!StringUtils.isBlank(templateLoaderPath))
        if(Paths.get(name).isAbsolute()) {
            return Paths.get(templateLoaderPath+ base +name.substring(1)).toString();
        }else {
            //return Paths.get(templateLoaderPath).resolve(name).toString();
             return templateLoaderPath + name ;
        }
    else {
        return name;
    }
}

简单来说就是
pug4j 和 spring-pug4j 都是有问题的

pug4j 的代码地址是这个,自己去下载吧
https://github.com/neuland/pug4j

@xl111
Copy link

xl111 commented May 8, 2021 via email

@hailiang-wang
Copy link
Member

最新的代码已经升级 spring-pug4j 和 pug4j 版本,请拉取后,使用

cd contact-center/app
mvn idea:idea

然后,在 IDEA 中进行验证。

@hailiang-wang hailiang-wang changed the title Windows开发时,使用 IDEA,启动后报错 Illegal char <:> at index 9: classpath:/templates/ 春松客服 Windows开发时,使用 IDEA,启动后报错 Illegal char <:> at index 9: classpath:/templates/ May 11, 2021
hailiang-wang pushed a commit that referenced this issue May 31, 2021
@hailiang-wang
Copy link
Member

@all-contributors please add @xl111 for code

@allcontributors
Copy link
Contributor

@hailiang-wang

I've put up a pull request to add @xl111! 🎉

@hailiang-wang
Copy link
Member

@all-contributors please add @viaco2ove for code

@allcontributors
Copy link
Contributor

@hailiang-wang

I've put up a pull request to add @viaco2ove! 🎉

@hailiang-wang
Copy link
Member

@all-contributors please add @understanding for test

@allcontributors
Copy link
Contributor

@hailiang-wang

I've put up a pull request to add @understanding! 🎉

@hailiang-wang
Copy link
Member

@all-contributors please add @MQPearth for test

@allcontributors
Copy link
Contributor

@hailiang-wang

I've put up a pull request to add @MQPearth! 🎉

@hailiang-wang
Copy link
Member

@all-contributors please add @SkorpiosL for test

@allcontributors
Copy link
Contributor

@hailiang-wang

I've put up a pull request to add @SkorpiosL! 🎉

@jiangxiangHN
Copy link

你拉错分支啦,我拉得master 就没有问题,拉7.0标签的就有这个问题

@viaco2ove
Copy link

viaco2ove commented Nov 30, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants