2015-09-14 4 views
1

Я пытаюсь написать программу, которая загружает классы и файлы jar. Мое приложение обрабатывает оператор плюс. Для этого у меня есть 2 класса и один файл jar:Как загрузить файл Jar в мою программу?

1-файл файла интерфейса оператора в каталоге D: \ operatorAPI (интерфейс оператора представляет собой файл JAR)

package OperatorAPI; 

public interface Operator 
{ 
    int calculate(int num1 , int num2); 
} 

2-класс Plus в каталоге (D: \ операторов)

package operators; 

import OperatorAPI.*; 

public class Plus implements Operator 
{ 
    public int calculate(int num1 , int num2) 
    { 
     return num1 + num2; 
    } 
} 

3- основной класс в директории D: \ источник \ главная:

package source.main; 

import java.util.*; 
import java.io.*; 
import java.net.URL; 
import java.net.URLClassLoader; 
import operatorAPI.*; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     File file = new File("D:\\"); 
     URI uri = file.toURI(); 
     URL[] urls = new URL[] {uri.toURL} 
     ClassLoader classloader = new URLClassLoader (urls); 
     Class clazz = classloader.loadClass("operator.Plus"); 

     Operator instance = (Operator) clazz.newInstance(); 
     int output = instance.calculate(10,20); 
     System.out.println("The result is :" + output); 
    } 
} 

Но когда я запускаю свою программу в командной строке я получаю это исключение: Исключение в потоке «основной» java.lang.NoClassDefFoundError: operatorAPI/Оператор

Я думаю потому, что интерфейс оператора баночка файл я должен загрузить это моя программа. Но я не знаю. Как это сделать. Может ли кто-нибудь мне помочь?

+0

D: \ operatorAPI добавлен в classpath? – Rehman

+0

Все, что вы делаете, добавляет диск 'D: \' к загрузчику классов, вы на самом деле не загружаете файлы Jar – MadProgrammer

+0

yes Я запускаю этот путь: java -cp Operator.jar source/main/Main.My teacher сказал, что я должен загрузить Operator.jar в классе Main. Но я не знаю, как это сделать. – soha

ответ

0

Что вы пытаетесь сделать, так это динамически загружать операторы (плюс и т. Д.). Если у вас есть классы операторов под «D: \», то способ загрузки является правильным. Однако ваш интерфейс «Оператор» в самом JAR не загружается. Оператор Plus зависит от этого интерфейса и ожидает его загрузки. Добавление файла operator.jar в путь к вашему решению должно решить проблему.

Если вы хотите загрузить «Operator.jar» также динамически, обновите URL-адреса, переданные URLClassLoader.

URL[] urls = new URL[] {uri.toURL, new File("PathtoOperator.jar").toURI().toURL() } 

Это должно устранить ошибку, которую вы получаете.

+0

Я добавляю во время компиляции, но не решен. java -cp Operator.jar source/main/Main – soha

+0

Является ли файл Operator.jar в каталоге, из которого выполняется команда java? – KDM

+0

@ KDM Да. Учитель сказал, что я могу загрузить файл jar в код, но я не знаю, как это сделать. – soha

1

В настоящее время вы используете только D:\ в вашем пути к классам:

File file = new File("D:\\"); 
URI uri = file.toURI(); 
URL[] urls = new URL[] {uri.toURL} 
ClassLoader classloader = new URLClassLoader (urls); 

Если вы хотите использовать файл банку, следует указать, что:

File file = new File("D:\\operator.jar"); 

Если это все вам нужно ваш новый загрузчик классов загружается, это должно быть единственное изменение, которое вам нужно. Имейте в виду, что вы можете сделать это аргументом командной строки, заметьте.

Как вы используете Operator в вашем классе «драйвер», вам понадобится это в пути к классам, с которым вы работаете. Например:

java -cp operatorAPI.jar;. source.main.Main 

Вам не нужно добавлять operator.jar к классам, когда составителя хотя ... если идея написать «подключаемую» систему, другие должны иметь возможность добавлять плагины без вас зная что-нибудь о них во время компиляции. Как ваш код, так и плагины должны знать только об общем интерфейсе.

+0

Я должен загрузить как класс класса плюс, так и файл jar – soha

+0

@soha: Класс 'Plus' является * в * файле jar (' operator.jar'), не так ли? Если нет, я отредактирую. –

+0

no Класс Plus находится в отдельном пакете (D: \\ operator.Plus) – soha

Смежные вопросы