【问题标题】:Change packaging from "/" to "."将包装从“/”更改为“.”
【发布时间】:2016-03-13 06:12:30
【问题描述】:

好的,所以我目前正在扫描文件夹 /Scripts/ 中的文件夹,并检查这些文件夹中的 .class

问题是当我去加载类加载器中的类时,我得到一个打包错误。它不是用“。”替换“/”。就像它应该的那样。

我的代码:

  @SuppressWarnings({"rawtypes", "unchecked"})
  public Class[] getClassesFromFolder() {
      File folder = getFolder();
      String thePath = folder.getPath();
      ArrayList<String> folders = new ArrayList<String>();
      ArrayList<String> classesName = new ArrayList<String>();

      try {
            Files.walk(Paths.get(thePath + "\\Scripts\\")).forEach(filePath -> {
                if (Files.isDirectory(filePath)) {
                    folders.add(filePath.toString());
                }
                if (Files.isRegularFile(filePath)) {
                    classesName.add(filePath.getFileName().toString());
                }
            });
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      ArrayList<Class<Script>> classes = new ArrayList<Class<Script>>();
      try {
        for(int i = 0; i < folders.size(); i++) {


          File scriptFolder = new File(folders.get(i).replaceAll("/", "\\\\"));
          System.out.println(scriptFolder.toString());



          URLClassLoader cl = new URLClassLoader(new URL[] {
                    new File(scriptFolder.toString())
                    .toURI().toURL() });
          for(int y = 0; y < classesName.size(); y++) {
            String script = classesName.get(y);

              if (script.contains(".class") && !script.contains("$")) {

                  String truePath = script.replace(".class", "");

                  try {
                      Class<?> scriptClass = (Class<?>) cl
                              .loadClass(truePath);
                      classes.add((Class<Script>) scriptClass);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }


              }
          }

          cl.close();
        }
      } catch (Exception e) {
          e.printStackTrace();
      }

错误:

    C:\Users\Ethan\Client\Scripts\com\ethan\test\main
Exception in thread "Thread-7" java.lang.NoClassDefFoundError: Core (wrong name: com/ethan/test/main/Core)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.client.api.script.ScriptManager.getClassesFromFolder(ScriptManager.java:103)
    at com.client.ui.components.ScriptSelector.getData(ScriptSelector.java:57)
    at com.client.ui.components.ScriptSelector.<init>(ScriptSelector.java:42)
    at com.client.ui.components.sidebar.panels.RunPanel$1.run(RunPanel.java:59)

【问题讨论】:

  • 你在错误的文件夹中,从C:\Users\Ethan\Client\Scripts\com\ethan\test\main向上移动到C:\Users\Ethan\Client\Scripts

标签: java package classloader packaging urlclassloader


【解决方案1】:

如果你有一个名为

的文件
C:\Users\Ethan\Client\Scripts\com\ethan\test\main\Core.class

它可能是包com.ethan.test.main 中名为Core 的类。

如果是这样,URLClassLoader 必须指定路径

C:\Users\Ethan\Client\Scripts

并且必须为loadClass() 方法命名

com.ethan.test.main.Core

如果类有main() 方法,这与您需要从命令行执行的操作完全相同:

java  -cp C:\Users\Ethan\Client\Scripts  com.ethan.test.main.Core

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多