Java로 플러그인 시스템을 구축하는 가장 좋은 방법


145

Java 애플리케이션을위한 플러그인 시스템을 어떻게 구현 하시겠습니까?

다음을 달성하기 쉬운 (개발자 용) 시스템을 사용할 수 있습니까?

  • 사용자는 플러그인을 앱의 하위 디렉토리에 넣습니다.
  • 플러그인은 구성 화면을 제공 할 수 있습니다
  • 프레임 워크를 사용하는 경우 라이센스가 상용 개발과 호환됩니까?

답변:


107

먼저 모든 플러그인이 구현해야하는 인터페이스가 필요합니다. 예 :

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

그런 다음 플러그인 작성자는 플러그인을 JAR 파일로 묶어야합니다. 애플리케이션이 JAR 파일을 연 다음 JAR 매니페스트의 속성 또는 JAR 파일의 모든 파일 목록을 사용하여 플러그인 인터페이스를 구현하는 클래스를 찾을 수 있습니다. 해당 클래스를 인스턴스화하면 플러그인을 사용할 수 있습니다.

물론 어떤 종류의 샌드 박스를 구현하여 플러그인이 할 수있는 것과 할 수없는 것으로 제한되도록 할 수도 있습니다. 나는 두 개의 플러그인으로 구성된 작은 테스트 응용 프로그램 을 작성 했으며 블로그 중 하나는 로컬 리소스에 대한 액세스가 거부되었습니다.


2
언급 한 샌드 박스는 실제로 가장 어려운 부분입니다! 그러나 걱정하지 마십시오-osgi는 이미 위에서 언급했듯이 당신을 위해 그것을합니다.
Chii

1
샌드 박싱은 그렇게 어렵지 않습니다. 올바르게하는 방법을 찾기 위해 약 2 주가 걸렸지 만 일단 그것이 간단하다는 것을 알게되었습니다. :)
Bombe

@Bombe이 예제 응용 프로그램은 여전히 ​​어디에 있습니까?
ataulm


@ timberwo7ves 나는 당신이 무슨 뜻인지 이해하지 못합니다. 파일 테스트 응용 프로그램은 게시물의 특정 위치와 언급 한 페이지에서 계속 다운로드 할 수 있습니다.
Bombe

41

OSGi를 사용하십시오 .

Eclipse 플러그인 시스템의 기초입니다. Equinox 는 Eclipse의 구현 (라이센스가있는 EPL)이고 Felix 는 Apache 프로젝트의 구현 (라이센스가있는 Apache Public License)입니다.

Eclipse는 OSGi가 언급 한 사항을 포괄 할 수있는 구체적인 예를 제공합니다 (또는 전체 Eclipse / SWT / JFace 스택을 원하는 경우 Eclipse RCP 위에 애플리케이션을 빌드 할 수 있음 ).


4
나는 OSGi를 다루었지만 정말 좋은 입문서를 찾지 못했습니다. 누군가가 여기에 링크를 추천 할 수 있다면 좋을 것입니다.
Brian Matthews

1
애플리케이션에 춘분을 포함시키고 표준 OSGi 사례를 사용하여 OP가 원하는 것을 정확하게 수행했습니다. 스윙도 SWT가 아닙니다. 웹 스타트. 좋은 시작 자원 : neilbartlett.name/blog
basszero

3
OSGi는 사실상 사실상 플러그인 시스템입니다. 그러나 표준 Java에서 OSGi 프로그래밍 모델로의 도약은 상당히 넓습니다.
Hendy Irawan

30

1.6부터는 간단한 시스템을 코딩하려는 경우 사용할 수있는 java.util.ServiceLoader 가 있습니다.

그러나 기본 기능 이상의 것을 원한다면 기존 프레임 워크 중 하나를 사용하십시오.


16

JPF를 사용한 사람이 있습니까? 흥미로운 것
Sven Lilienthal

1
JabRef는 플러그인에 JPF를 사용합니다. 아주 잘 작동합니다.
koppor

JPF를 사용하고 있지만 Ant와 밀접하게 연결되어 있습니다. 제거하고 싶지만 응용 프로그램에 얼마나 많은 영향을 미치는지 모르겠습니다.
MartinL

공개 소스 제품 (OpenEMM)을위한 JPF 플러그인을 만들었습니다. 나는 그것을 maven (maven-assembly plugin)으로 만들 수 있었다. 확실히 지금도 개발의 단순함을 높이 평가합니다. 아마도 OSGI 일 것입니다.
рüффп

JPF 사용에 대한 Java 버전에 대한 제한이 있습니까?
Madhav

16

PF4J를 사용하십시오 . Web, Spring 및 Wicket을 지원합니다. 사용하기 쉬운 어플리케이션


나는 이것이 내가 필요로하는 것을 발견하고 그것은 매우 단순 해 보이지만 그것에 대해 약간의 도움이 필요하다
nonybrighto

github에서 Decebal에게 질문을 제기하십시오. 그는 당신을 도울 것입니다
Daniel Jipa

참조 meta.stackoverflow.com/questions/376686/...을 Decebals 계정 상태 여기에
볼프강 Fahl

1
당신이 pf4j에서 찾고 있다면, 당신은 또한 한 번 봐 걸릴 수 있습니다 github.com/hank-cp/sbp을 . pf4j 위에 구축되어 스프링 부트를 지원하여 완전한 웹 애플리케이션을 구축합니다.
Hank

13

나는 OSGi에서 일주일 동안 일했습니다. 결국 그것은 나쁜 꿈과 같았지만 많은 것을 배웠습니다.

OSGi를 작동시킬 수있었습니다 (쉬운 것은 아니며 모든 예제가 오래되었습니다. 넷의 모든 것이 5 세가 아닌 경우 3 세 이상임). 그러나 문제로 인해 기존 프로젝트에 통합하는 데 심각한 문제가있었습니다. 항아리가 나타납니다.

간단히 말해서, 매니페스트를 작성하는 데 사용되는 모호한 도구는 거의 없으며 문서화가 잘되어 있지 않습니다 (BND 도구는 모호하지 않지만 Eclipse의 특정 프로세스를 위해 설계되었습니다). 또한 사용 가능한 대부분의 OSGi 정보는 기존 데스크톱 응용 프로그램이있는 응용 프로그램 개발자를 대상으로하지 않습니다.

이로 인해 정보에 대한 맥락이 흐리거나 부적절합니다. Neil Bartlett의 블로그 게시물이 가장 큰 도움이되었지만 작동 시스템을 얻지 못한 사람들도있었습니다 (필릭스 자습서에서 일부 코드를 가져 와서 내장 된 프레임 워크 롤링을 위해 함께 조각했습니다). 필자가 몇 년 전에 무료로 게시 한 책 초안을 찾았지만 Eclipse OSGi 지원 변경으로 인해 Eclipse의 예제가 작동하지 않습니다.

모든 단계는 큰 장애물입니다. 나중에 여기에 더 자세한 내용을 게시하려고합니다.


17
이것이 어떻게 대답입니까? OSGi에 대한 불만이 많으며 OSGi가 무엇인지 설명조차하지 않습니다.
Stealth Rabbi

@StealthRabbi이 "답변"당시, 그리고 얼마 후, OSGi와 함께 일하려는 사람에게 좋은 정보였습니다. OSGi는 이미 토론의 일부이므로 정의 할 필요가 없었습니다. 그것은 사람들이 일주일의 일을 구할 수 있다는 점에서 해답입니다.
Sean Anderson

9

위에서 언급 한 문제를 해결하기 위해 OSGi를 권장하는 것은 매우 나쁜 조언이라고 생각합니다. OSGi는 "올바른 선택"이지만 위의 시나리오에서는 JPF 또는 자체 개발 한 최소한의 프레임 워크로 충분하다고 생각합니다.


3

몇 년 전 저는 그런 프로젝트를 시작했고 곧 준비가 되길 바랍니다. NetBeans 및 Eclipse와 같은 프로젝트에서 영감을 얻었지만 조금 다른 것으로 변경되었습니다. OSGi는 현재 좋은 선택처럼 보이지만 내 프로젝트와 비교할 기회가 없었습니다. 위에서 언급 한 JPF와 비슷하지만 동시에 여러면에서 다릅니다.

저에게 동기를 부여한 기본 아이디어는 웹 응용 프로그램, 데스크탑 응용 프로그램 또는 애플릿 / JWS 응용 프로그램 (물론 UI는 아직 다루지 않음)을 핵심 기능으로 분리하지 않고도 Java 응용 프로그램을 최대한 쉽게 구축하는 것입니다.

나는 몇 가지 목표를 가지고 프로젝트를 만들었습니다.

  • 웹 응용 프로그램 또는 데스크톱 응용 프로그램을 빌드하는 것은 중요하지 않습니다. 일반적인 기본 방법 인 No fancy web.xml 선언과 같은 방식으로 응용 프로그램을 시작해야합니다 (표준 웹 디스크립터를 사용하는 것에 반대하지는 않지만 "서블릿"을 추가하는 플러그인 시스템과 잘 어울리지 않습니다. 나는 그것들을 RequestHandler (s)라고 부릅니다.
  • "확장 점"주위에 "확장자"를 쉽게 꽂을 수 있습니다. Eclipse의 무언가이지만 다른 접근 방식입니다.
  • 자체 배포 가능, 모든 플러그인이 등록되어 있기 때문에 (XML 파일) 응용 프로그램은 빌드 시스템과 독립적으로 자체 배포 가능해야합니다. 물론 우리 세계와 연결되는 Ant 작업과 Maven MOJO가 있습니다. 응용 프로그램을 호출하고 특정 위치에 자체 배포하도록 지시합니다.
  • Maven에서 빌린 경우 리포지토리 (Maven 1 및 2 리포지토리 포함)에서 코드를 다운로드 할 수 있으므로 리포지토리에 액세스 할 수있는 한 응용 프로그램을 하나의 작은 항아리로 배포 할 수 있습니다 (유용한 시간이며 기본적으로 자동 지원을 제공합니다) 업데이트-웹 응용 프로그램에서 새로운 버전이 있음을 알리는 아이디어가 마음에 들지 않습니다. 다운로드되어 있으며 설치 권한이 필요합니까?
  • 장애 발생시 시스템 상태, 이메일 알림에 대한 기본 애플리케이션 모니터링

2
나는 잔소리를 의미하지 않지만 그 이후로 일한 적이 있습니까? 코드를 사용할 수 있습니까 (있는 그대로 사용하거나 추가 할 수 있음)?
Piccolo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.