2012-04-05 4 views
1

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

+0

посмотрите на этом посту: http://stackoverflow.com/questions/183292/classpath-including-jar-within-a-jar – dexametason

+0

* «Возможно ли построить aj ar файл, состоящий из всех файлов jar, которые мне нужны? »* Обычно лучше включать манифест в основной Jar, который идентифицирует зависимые Jars по относительным путям. Почему вы не реализуете эту стратегию? –

ответ

3

Есть плагины Eclipse, которые могут сделать это FatJar, JarsSplice

+0

FatJar действительно прост в использовании, и он работает .. .thanks – ict1991

-1

Ну, файл jar не может содержать другой файл jar, но вы можете создать большой файл jar со всеми классами, которые вы хотите использовать из нескольких файлов jar.

0

Невозможно. Вы не можете включать банки в банку, чтобы иметь их на пути к классу (вы можете поместить их в банку, но вы не можете использовать их в качестве зависимостей).

Maven, однако, дает вам альтернативу maven-assembly-plugin. Он распаковывает все банки и хранит их .class файлы в вашей новой, единственной банке. Конечно, есть и другие варианты сделать то же самое, но maven - отличный инструмент построения, который можно использовать в любом случае.

+0

* «Невозможно. Вы не можете включать банки в банку». * Конечно, вы можете. Независимо от того, можно ли его заставить работать во время выполнения, это отдельный вопрос. В этом отношении, я полагаю, *** существуют также пользовательские загрузчики классов, которые могут загружать ресурсы из Jar внутри других Jars. –

+0

да, вот что я имел в виду. Конечно, их можно положить, но вы не можете их использовать. Классный загрузчик - хорошая идея, возможно, у вас есть ссылка? – Bozho

+0

Я думал, вы могли бы спросить об этом. ;) Быстрый поиск на «jar class loader» показывает .. много лоскутов, но в 1-м 5 хитах есть ссылка на «One Jar», как упоминалось evanwong. * «One-JAR предоставляет пользовательский загрузчик классов, который знает, как загружать классы и ресурсы из банок внутри архива, а не из банок в файловой системе». * * –

0

yguard tool может это сделать. Он также может сжимать ваш код и обфускать его, если хотите.

Вот муравей пример из их документации:

<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="buildlib/yguard.jar"/> 

    <inoutpairs resources="auto"> 
    <fileset dir="${input-lib-dir}"> 
     <include name="myapp*.jar"/> 
     <exclude name="*_obf.jar"/> 
    </fileset> 
    <mapper type="glob" from="*.jar" to="*_obf.jar"/> 
    </inoutpairs> 
0

Вы можете использовать один баночку Maven плагин в

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
    <!--     REPOSITORIES       --> 
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 

    <pluginRepositories> 
     <pluginRepository> 
      <id>onejar-maven-plugin.googlecode.com</id> 
      <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
     </pluginRepository> 
    </pluginRepositories> 
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
      <!--      ONE JAR PLUGIN      --> 
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>org.acme.MainClass</mainClass> 
          </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.dstovall</groupId> 
       <artifactId>onejar-maven-plugin</artifactId> 
       <version>1.4.4</version> 
       <executions> 
        <execution> 
         <configuration> 
          <!-- Optional --> 
          <onejarVersion>0.97</onejarVersion> 
          <!-- 
           Optional, use only if you need to include native libraries 
           (dll's) <binlibs> <fileSet> 
           <directory>${project.build.directory}/dllextract</directory> 
           <includes> <include>test.dll</include> </includes> </fileSet> 
           </binlibs> 
          --> 
          <!-- Optional, default is false --> 
          <attachToBuild>true</attachToBuild> 
          <!-- Optional, default is "onejar" --> 
          <classifier>onejar</classifier> 
         </configuration> 
         <goals> 
          <goal>one-jar</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
Смежные вопросы