2013-01-16 11 views
8

Czytałem tak wiele artykułów/wyjaśnień na ten temat i spędziłem zbyt wiele godzin, ale wszystko jest albo zbyt szerokie, albo konkretne.Jak połączyć wiele słoików w jeden?

To pytanie dotyczy tylko apletu, który zrobiłem. Zawiera jedną klasę i wymaga 2 innych bibliotek JAR. Zawarłem je w projektach (wiele projektów, ponieważ próbowałem tego w Netbeans i Eclipse ... łatwo jest odtworzyć projekt jednej klasy). Chodzi o to, że mój projekt HTML/web nie powinien zajmować się więcej niż jednym słoikiem lub odnosić się do nich. To wcale nie jest skomplikowany aplet/projekt.

Pierwotnie zrobiłem to w Netbeans. Ma pakiet główny, a po dodaniu 2 JARów jest umieszczany w obszarze "Biblioteki" (folder "zasoby"). Po zbudowaniu Netbeans tworzy Jar dla mojego jednego pakietu/klasy, a następnie umieszcza 2 inne biblioteki w katalogu "lib" obok. Chciałbym, żeby byli w jednym, nadającym się do dystrybucji Jar. Z wielu rzeczy, które przeglądałem, próbowałem umieścić w build.xml:

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="dist/BigJar.jar"> 
    <zipfileset src="dist/cxapplet.jar"/> 
    <zipfileset src="resources/dpotapi.jar"/> 
    <zipfileset src="resources/dpotjni.jar"/> 
    </jar> 
</target> 

Ale nic nie produkuje. Mam to od NetBeans - deploying all in one jar. Nie wiem/nie rozumiem, jak używać build.xml, więc nie byłbym zaskoczony, gdyby coś poszło nie tak (oczywiście), ale nie otrzymuję komunikatów o błędach/ostrzeżeniach.

Kiedy zrobiłem to w Eclipse, to skutecznie je łączy, ale kiedy używam Słoika w moim rzeczywistym projekcie sieciowym, mówi, że nie może znaleźć klas z pozostałych 2 Słoików. Nie rozumiem, jak to naprawić, ale czy jest to problem z Classpath? W Eclipse tworzę nowy katalog o nazwie "lib" i umieszczam w nim Jarsa. Następnie klikam prawym przyciskiem myszy projekt, przechodzę do "Ścieżki budowania Java" i dodajemy słoiki, sprawdzając je także w zakładce "Zamawianie i eksportowanie". Z rzeczy, które przeczytałem, klikam prawym przyciskiem myszy projekt, wybieram "Eksportuj", wybieram "Jar", odznaczam pliki ".classpath" i ".project", sprawdzam tylko "Eksportuj wygenerowane pliki klas i zasoby", a następnie pozwól mu wygenerować plik manifestu. Tak jak powiedziałem, generuje jeden słoik, ale jego zawartość to mój pakiet, a następnie katalog "lib" zawierający 2 inne słoiki. Manifest jest tam, ale jest całkiem pusty i nie odwołuje się do żadnych plików (nie jestem pewien, czy to ważne). Kiedy umieściłem to w mojej aplikacji internetowej, oznacza to, że aplet nie może znaleźć innych klas.

To po prostu wydaje się takie proste - jeden pakiet/klasa, dwa zewnętrzne Jars ... łączą się w jeden Jar, gdy są budowane do dystrybucji jako aplet. Jakieś pomysły?

UPDATE:

Ponieważ zaczęliśmy używać Maven, ktoś spojrzał za pomocą wtyczki Maven. Więc skończyło się tworząc nowy projekt domu apletu (ponieważ jest on używany w wielu projektach), a używane to w naszym pom.xml, w końcu:

<build> 
    <resources> 
    <resource> 
     <directory>${basedir}/applet</directory> 
     <excludes> 
     <exclude>codesignstore</exclude> 
     </excludes> 
    </resource> 
    <resource> 
     <directory>${basedir}/src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    </resources> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>cxapplet</finalName> 
     <archive> 
      <index>true</index> 
      <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      </manifest> 
     </archive> 
     <appendAssemblyId>false</appendAssemblyId> 
     </configuration> 
     <executions> 
     <execution> 
      <id>make-my-applet-jar</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jarsigner-plugin</artifactId> 
     <version>1.2</version> 
     <executions> 
     <execution> 
      <id>sign</id> 
      <goals> 
      <goal>sign</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <keystore>${basedir}/applet/codesignstore</keystore> 
     <alias>codesigncert</alias> 
     <storepass>HIDDEN</storepass> 
     <keypass>HIDDEN</keypass> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

I to było dobre, bo to pozwoliło nam wykorzystać nasze Certyfikat podpisywania kodu, aby automatycznie go podpisać.

+1

* "Chodzi o to, że mój projekt HTML/web nie powinien zajmować się więcej niż jednym Jar" * Jest to banalne, aby przeglądarka mogła sobie z tym poradzić. * "Jakieś pomysły?" * Rozmieść słoiki w zwykły sposób (który ma przewagę nad aktualną strategią) i oszczędzaj czas. –

+0

Lepiej jest uzależniać jeden słoik od drugiego. Wiele narzędzi do tworzenia słoików ułatwia pracę. –

+0

@joeyrohan Nie jestem pewien co masz na myśli, ale właśnie dlatego próbuję użyć narzędzi do budowania Netbeans i Eclipse, które, jak sądziłem, by to zrobiły, aby to osiągnąć. – Ian

Odpowiedz

4

Po pierwsze, pozwól mi powiedzieć, że naprawdę nie ma powodu, aby łączyć słoiki - możesz wdrożyć aplet przy użyciu pliku klasy (nie w słoiku) i oddzielnych słoików zależnych.

Jednakże, jeśli uważasz, że musisz zrobić jeden duży słoik ze swojej klasy i wszystkie jego zależności, możesz to zrobić.

Nie można jednak umieścić plików jar w innym pliku jar - pliki jar nie działają w ten sposób. Potrzebne jest wyodrębnienie całej zawartości wszystkich plików jar, a następnie ponowne skompresowanie do jednego słoika.

Jeśli masz zamiar to zrobić, proponuję użyć narzędzia do budowania Maven, aby to zrobić. Po skonfigurowaniu kompilacji przy użyciu Maven, możesz skonfigurować Maven Assembly Plugin do zbudowania jednego dużego słoika.

Wiem, że Eclipse wspiera Mavena, i zakładam, że NetBeans również to robi.

+0

Przepraszam, wiedziałem, że samo połączenie słoików nie zadziała, z podanych przez ciebie powodów. Sądzę więc, że mam nadzieję, że otrzymam prosty przykład kodu/pracy/logiki, który wyjaśnia, jak osiągnąć to, co chcę w wybranym przez ciebie scenariuszu - Eclipse, Netbeans, Maven, cokolwiek. Tak więc, jak zasugerowałeś używanie Mavena, nie wiedziałem, czy możesz podać kilka kroków, aby to zrobić. Przyjrzę się drugiemu łączu (ponieważ mam zainstalowane Mavena i używam go w innym projekcie, chociaż nie jestem tym, który nim zarządza). Więc dziękuję :) – Ian

-1

Od podstawy katalogu bin, to dlaczego nie spróbować:

jar.exe -cvf cxapplet.jar * 

Skieruj zewnętrzne pliki jar w odpowiednim miejscu w was katalogu bin i ręcznie jar pliki klasy z zewnętrznych plików jar.

Alternatywnie, patrz this thread, które mogą dostarczyć więcej informacji.

+0

"dlaczego nie spróbować" - ponieważ zrobiłem to Nie myślę o tym :) Nigdy nie przyszło mi to do głowy, i nie wiedziałem, jak efektywnie używać narzędzia jar, lub pomyśleć o używaniu go na bin. Ponadto, jedyną rzeczą w katalogu 'bin' jest skompilowany kod mojej głównej klasy (poprzez jego pakiet), więc jak mógłbym dołączyć rzeczy do katalogu' lib' (obok 'bin'), które są dwoma zewnętrznymi słojami i wyodrębnić/połączyć je z zawartością katalogu 'bin'? – Ian

+0

(Robię to z pamięci czegoś, co próbowałem około 4 miesięcy temu). Wystarczy skopiować katalog lib do katalogu kompilacji po zbudowaniu projektu. Zobacz także moją zmienioną odpowiedź. – AerusDar

+0

Jezu, nie wiem, dlaczego nie myślałem, żeby to zrobić. Więc kiedy spróbowałem, to je łączy, ale po prostu umieszcza dwa zewnętrzne JARA w korzeniu nowego Słoika ... ale wydaje mi się, że to, czego naprawdę potrzebuję, to wyodrębnić wszystko z zewnętrznych Jarsów, a następnie zaminować je wszystkie znowu razem. Czy to ma sens? Netbeans skutecznie robi to samo, co podałeś, z wyjątkiem dodania ich do ścieżki klas w pliku manifestu, aby były rozpoznawalne (lub jakkolwiek działa). – Ian