Компиляция кода Java без зависимостей [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть источник для java-программы, но у меня нет его зависимостей. Можно ли компилировать Java-код, который использует поля, классы и методы, которые не могут быть решены? Если нет, есть ли программа или плагин Eclipse, который автоматически генерирует поддельные классы, переменные и методы, которые не могут быть разрешены во время компиляции? Приведите примеры.

public class Main {
    public static void main(String[] args) {
        // ...
        UnknownClass.unknownMethod();
    }
}

Я хочу, чтобы он автоматически генерировал класс UnknownClass методом unknownMethod():

public class UnknownClass {
    public static void unknownMethod() {}
}

но не экспортировать его в выходной .Джар

1 ответов


можно ли компилировать Java-код, который использует поля, классы и методы, которые не могут быть решены?

нет. Статические зависимости для исходного кода должны быть доступны во время компиляции.

если нет, есть ли программа или плагин Eclipse, который будет автоматически генерировать поддельные классы, переменные и методы, которые не могут быть решены во время компиляции?

насколько мне известно, нет.

на самом деле, я думаю что технически невозможно построить такую программу. Это повлечет за собой вывод подписей для классов и методов, о которых у нас нет никакой информации. Я не думаю, что это возможно сделать точно; то есть достаточно точно, чтобы подписи соответствовали фактическим подписям реальных классов.

(некоторые из проблем, которые необходимо решить, решили, необходимая супертипы для классов, использовать правильные типы для Аргументов и результатов методы, выводя, имеет ли метод varargs, выводя, существует ли метод с перегрузками и так далее. Некоторые из этих проблем поддаются решению,другие-нет.)


но как Буккит сделал это с CraftBukkit.банку и Bukkit.банку? в под Bukkit.jar, есть заголовки методов без внутреннего кода, однако при компиляции вашего кода для BUkkit.jar, он работает с Craftbukkit.сосуд.

Я думаю, вы сами ответили на свой вопрос. Этот иерархия классов и заголовки методов находятся в предоставленном файле JAR Bukkit. Поэтому их не нужно выводить.

напротив, то, что вы просите сделать, - это вывести иерархии классов и сигнатуры методов с чистого листа ... плюс некоторые ограничения, подразумеваемые кодом (вашим исходным кодом), который их использует.


вот пример:

   UnknownClass c = ...
   c.method(42);
   c.method(42.0);

есть несколько разные решений что:

   public class UnknownClass ... {
       void method(double arg) {...}
   }

   public class UnknownClass ... {
       int method(double arg) {...}
   }

   public class UnknownClass ... {
       void method(int arg) {...}
       void method(double arg) {...}
   }

   public class UnknownClass ... {
       void method(byte arg) {...}
       void method(double arg) {...}
   }

   public class UnknownClass ... {
       void method(double... arg) {...}
   }

и так далее.

вопрос: какой из них правильный; т. е. тот, который будет соответствовать фактическим подписям в реальном UnknownClass?

ответ: Мы не знаем! И это имеет значение, потому что если мы ошибемся, скорее всего, будут ошибки classloader при попытке запустить скомпилированный код против JAR, содержащего реальный класс.