MiraiForum

    • Register
    • Login
    • Search
    • Popular
    • Recent
    • Unsolved
    • Tags
    • Groups
    • 友情链接

    Solved 请教一下如何使用/src/main/resources下的文件?

    技术交流板块
    5
    12
    172
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • sweetymajo
      sweetymajo last edited by

      可能问的问题比较愚蠢。
      我是一个新手,之前有过别的语言的开发经验,但是没接触过java和kotlin。最近在尝试kotlin开发mirai插件。
      我想使用Ktor做一个静态网页服务。
      以下的代码在一般程序下kotlin程序下有效,但是在mirai插件中无法生效。
      (文件路径为/src/main/resources/static/index.html)

          route("/") {
              static {
                  resource("", "index.html", "static")
              }
          }
      

      我kotlin开发经验不足,大概猜测在mirai插件中无法直接使用/src/main/resources下的文件,因此请教一下应该如何读取这样的文件。

      X 1 Reply Last reply Reply Quote 0
      • Topic has been marked as a question  sweetymajo sweetymajo 
      • Samarium150
        Samarium150 ⭐2021⭐ last edited by

        试试javaClass.classLoader.getResource?

        sweetymajo 1 Reply Last reply Reply Quote 0
        • D
          diyigemt last edited by

          你可以让用户额外下载一个资源文件放到插件自己的data文件夹中(./data/插件包名/),然后用这样访问

          routing {
              static("/") {
                file("/", "${插件入口.dataFolder.absolutePath}/dist/index.html")
              }
          
              // Static plugin. Try to access `/static/index.css`
              static("/static") {
                files("${插件入口.dataFolder.absolutePath}/dist/static")
              }
            }
          
          sweetymajo 1 Reply Last reply Reply Quote 0
          • sweetymajo
            sweetymajo @Samarium150 last edited by

            @Samarium150 这块的资料调查过了,那个是直接获取资源文件的内容,而这里是指定资源文件的路径,似乎不太适合用这个方法。

            1 Reply Last reply Reply Quote 0
            • cssxsh
              cssxsh last edited by

              你需要手动指定 classLoader

              sweetymajo 1 Reply Last reply Reply Quote 0
              • sweetymajo
                sweetymajo @diyigemt last edited by

                @diyigemt 非常感谢解答。我现在就是采用的这种方式解决的。
                但是感觉不是很方便。这样每次部署插件的时候,需要将静态页面和动态页面的文件从resources下先释放到本地路径下再使用。总感觉自己绕了很大的弯路,所以想看看是否有直接使用resources下文件的方法。

                1 Reply Last reply Reply Quote 0
                • sweetymajo
                  sweetymajo @cssxsh last edited by

                  @cssxsh 非常感谢解答,我目前刚接触java相关的开发,对于classLoader没什么概念,我先去调查一下相关的资料。

                  1 Reply Last reply Reply Quote 0
                  • cssxsh
                    cssxsh last edited by

                    ApplicationEnvironment 有个属性是 classLoader
                    你需要 把他调整为插件的 classLoader

                    sweetymajo 3 Replies Last reply Reply Quote 0
                    • sweetymajo
                      sweetymajo @cssxsh last edited by

                      This post is deleted!
                      1 Reply Last reply Reply Quote 0
                      • sweetymajo
                        sweetymajo @cssxsh last edited by

                        This post is deleted!
                        1 Reply Last reply Reply Quote 0
                        • sweetymajo
                          sweetymajo @cssxsh last edited by

                          @cssxsh 反复折腾了一下午,终于搞定了。感谢大佬提供的思路。

                          现在提供一下我的做法:

                          fun startWebServer(){
                              val env = applicationEngineEnvironment {
                                  envConfig()
                              }
                          
                              val webServer = embeddedServer(Netty, env)
                              GlobalScope.launch {
                                  webServer.start(true)
                              }
                          }
                          
                          private fun ApplicationEngineEnvironmentBuilder.envConfig() {
                              classLoader = XXXBot::class.java.classLoader
                          
                              module {
                                  module()
                              }
                              connector {
                                  host = "0.0.0.0"
                                  port = 8080
                              }
                          }
                          
                          1 Reply Last reply Reply Quote 0
                          • Topic has been marked as solved  sweetymajo sweetymajo 
                          • X
                            xunaiyi @sweetymajo last edited by

                            @sweetymajo 建议搞前后端分离,我是做java的 ,kotilin 也不是很懂。

                            1 Reply Last reply Reply Quote 0
                            • 1 / 1
                            • First post
                              Last post
                            Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact