2013-05-09 6 views
0

Это убивало меня весь день. Я работаю над android/java в затмении.Maven 3 «uber jar» как встроить банку в банку?

Это то, что я хочу сделать

  • Я хочу, чтобы вставить одну из моих библиотек - DatabaseLibrary

  • в другой из моих библиотек - LogicLibrary

Кардинально - без подвергая любой из методов в DatabaseLibrary третьей стороне, имеющей доступ к LogicLibrary.


Я попытался включить его с помощью Proguard-Maven-плагин как этот

<configuration> 
       <assembly> 
       <inclusions> 
        <inclusion> 
         <groupId>xxx</groupId><artifactId>DatabaseLibrary</artifactId><library>true</library> 
        </inclusion> 
       </inclusions> 
      </assembly> 

Однако это включает в себя все методов в DatabaseLibrary и подвергают их на 3-й партии.

Я хочу, чтобы моя LogicLibrary могла звонить с помощью DatabaseLibrary без участия третьей стороны.

Я искал по всему Интернету, и кажется, что что-то называемое uber jar - это то, что мне нужно сделать. Однако я попробовал несколько методов, такие как Maven-сборка-плагин, упомянутых здесь https://stackoverflow.com/a/1834905/1312937

maven embed dependency artifact code in jar

Однако я не получил не где с этим, похоже, это Maven 2 ответа так может быть, есть что-то другое мне нужно сделать для maven 3?

Может ли кто-нибудь сказать мне, если uberjar является правильным способом для меня достичь моих целей? Если есть альтернативные образцы, пожалуйста, дайте мне знать, я не привязан к maven.

ответ

1

Я думаю, что uber jar - неправильный маршрут. Вместо этого, чтобы выполнить вашу цель скрывать методы из DatabaseLibrary, но сделать их доступными для вашей логики, я бы объявил ваши методы «защищенными», что ограничивает его видимость на уровне пакета. Учитывая, что вы убедитесь, что любые классы, которые должны были говорить между банками, были в одном пакете (хотя в отдельных банках). Это заставит стороннего поставщика использовать только общедоступные методы, доступные для них.

- DatabaseLibrary 
    |- com.mycompany 
     |- DatabaseClass 

-LogicLibrary 
    |- com.mycompany 
     |- LogicClass 


public class DatabaseClass{ 
    protected void doSomething(){ 
    } 
} 

public class LogicClass{ 
    public void doSomething(){ 
     DatabaseClass dbClass = new DatabaseClass(); 
     dbClass.doSomething(); 
    } 
} 

Теперь вы третий поставщик сторона будет видеть только LogicClass.doSomething()

Смотрите также: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

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

1

Путь Java classpath просто не работает так, как вы думаете. Вы не можете «скрыть» один из файлов jar и все еще иметь его доступным.

Концепция 'uberjar' состоит в том, чтобы просто распаковать все файлы jar, а затем добавить все классы/ресурсы в один большой файл jar.

К сожалению, я не знаю, как ограничить доступ к файлу jar.

+0

Хорошо возможно это uberjar неверно, конечно, я могу иметь банку, который ссылается на другую банку не обнажая эту внутреннюю банку для пользователя, хотя? Или, возможно, uberjar - это правильный способ, так как я могу разрешить этап модификации контента/доступа моей сборки maven, чтобы сделать все мои методы и классы закрытыми, кроме нескольких открытых в внешнем банке, которые я хочу, чтобы пользователь был способный использовать. –

+0

Нет, я боюсь, что нет специального статуса, который вы можете наделить конкретным файлом jar, ни каким-либо хорошим способом как отдать его пользователю, так и «скрыть» его от них. AFAIK. Если вам нужен этот элемент управления, вам нужно использовать что-то другое, кроме Java. Создание частных методов Java на самом деле не останавливает никого, кроме случайного наблюдателя от их вызова. – GreyBeardedGeek

0

Это может не относиться к Android, потому что я не уверен на 100%, как работают загрузчики классов в Android. Но эта идея должна работать на Java вообще.

Так что вы хотите это сделать, создайте загрузчик классов, который позволит вашим классам внутри LogicLibrary загружать DatabaseLibrary. Существует несколько решений, один из которых - один из них: http://one-jar.sourceforge.net/. Это позволяет упаковать одну банку в другую, а затем использовать пользовательский загрузчик классов для загрузки банку в банке «uber». В одной из ваших ссылок есть еще одна ссылка, как создать это с помощью сборки maven.

Я не использовал его, поэтому я не уверен, что он подойдет вашим потребностям. Но вы можете создать свой собственный загрузчик классов, который расшифровывает зашифрованные JAR-файлы или проверяет подпись или использует любой механизм, в котором вы нуждаетесь. Вы даже можете поместить свою библиотеку в защищенный паролем zip-файл и позволить загрузчику классов распаковать его.Использование пользовательского загрузчика классов - это путь.

Вы можете использовать плагин сборки maven, чтобы просто распаковать один Jar, включить другой Jar и затем упаковать его обратно (а затем использовать собственный загрузчик классов). Но он не будет защищать Jar много ...

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

  • Нет связанных вопросов^_^