2012-06-27 6 views
7

Jestem programistą .NET, który musi korzystać z platformy Java dla nowego projektu.Jak zorganizować rozwiązanie Java w wielu projektach, takich jak Visual Studio?

"Rozwiązania" to przydatna koncepcja Visual Studio. W jaki sposób mogę złamać moje rozwiązanie Java na "projekty" (chyba pakiety Java), które mają kompilacje współzależności w tym samym repozytorium kontroli kodu źródłowego?

Planujemy wykorzystać Mavena do współpracy z innymi firmami, a Scala do napisania niektórych bibliotek.

Musimy również być niezależni od IDE.

Zalecenia z wdzięcznością otrzymane!

Edycja: Załóżmy, że rozwiązanie będzie zawierać aplikację internetową, aplikację konsoli i bibliotekę napisaną w Scali.

Odpowiedz

9

Ustanowiłem podobny model, który można studiować.

Korzystając z Mavena, będzie on tak samo agnostyczny jak IDE. Nie będziesz musiał przechowywać żadnych konkretnych ustawień IDE w VCS, tylko kod źródłowy i pliki pom. Każdy programista uruchomi swoje IDE i wskaże pierwszą pom i projekt powinien się załadować. Ustawienia lokalne zostaną utworzone, ale powinny zostać zignorowane podczas zatwierdzania do VCS.

Po pierwsze, wielomodułowy projekt Maven będzie z pewnością miał bardzo podobny układ jak rozwiązanie C# z jego projektami. Górny folder z rodzicem-pom będzie podobny do rozwiązania z udostępnionymi konfiguracjami i kolejnością kompilacji itp. Wtedy podfoldery z pod-poms będą pasować do definicji projektu z zależnościami między innymi projektami.

directory layout

+- pom.xml 
+- scala 
| +- pom.xml 
| +- src 
| +- main 
|  +- scala 
+- console 
| +- pom.xml 
| +- src 
| +- main 
|  +- java 
+- web 
    +- pom.xml 
    +- src 
    +- main 
    +- java 
    +- resources 
    +- webapp 
     +- WEB-INF 
     -- web.xml 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q11226363</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <name>${project.artifactId}-${project.version}</name> 

    <properties> 
     <scala.version>2.9.2</scala.version> 
    </properties> 

    <modules> 
     <module>scala</module> 
     <module>web</module> 
     <module>console</module> 
    </modules> 

    <dependencyManagement> 
     <dependencies> 
      <!-- Inter-Module dependencies --> 
      <dependency> 
       <groupId>com.stackoverflow</groupId> 
       <artifactId>Q11226363-scala</artifactId> 
       <version>${project.version}</version> 
      </dependency> 
      <dependency> 
       <groupId>org.scala-lang</groupId> 
       <artifactId>scala-library</artifactId> 
       <version>${scala.version}</version> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <repositories> 
     <repository> 
      <id>scala-tools.org</id> 
      <name>Scala Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>scala-tools.org</id> 
      <name>Scala Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </pluginRepository> 
    </pluginRepositories> 

</project> 

scala/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-scala</artifactId> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-library</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <sourceDirectory>src/main/scala</sourceDirectory> 

     <plugins> 
      <plugin> 
       <groupId>org.scala-tools</groupId> 
       <artifactId>maven-scala-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
         <phase>compile</phase> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <goals> 
          <goal>testCompile</goal> 
         </goals> 
         <phase>test-compile</phase> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

console/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-console</artifactId> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.stackoverflow</groupId> 
      <artifactId>Q11226363-scala</artifactId> 
     </dependency> 
    </dependencies> 

</project> 

web/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-web</artifactId> 
    <packaging>war</packaging> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.stackoverflow</groupId> 
      <artifactId>Q11226363-scala</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>webapp</finalName> 

     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.2</version> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

scala/src/main/scala/com/stackoverflow/Q11226363/ScalaApp.scala

/** 
* @author maba, 2012-06-28 
*/ 
package com.stackoverflow.Q11226363 

class ScalaApp { 
    def helloScala():String = "Hello from Scala!" 
} 

console/src/main/java/com/stackoverflow/Q11226363/JavaApp.java

package com.stackoverflow.Q11226363; 

/** 
* @author maba, 2012-06-28 
*/ 
public class JavaApp { 
    public static void main(String[] args) { 
     ScalaApp scalaApp = new ScalaApp(); 
     System.out.println("Scala says: " + scalaApp.helloScala()); 
    } 
} 

To zostało przetestowane przeze mnie. Oczywiście mogą być pewne ulepszenia plików pom i zależności, ale to dobry początek.

Jeśli spojrzysz na numer web/target, znajdziesz numer webapp.war, który będzie zawierał wymagane zależności.

Oczywiście można podzielić wszystkie te moduły i zbudować je oddzielnie, a mimo to mieć zależności między nimi, ale jak już powiedziałem, jest to dobry punkt wyjścia.

+1

Co za zadziwiająco dobra odpowiedź na to pytanie. Dziękuję Ci! –

+0

@PeteMontgomery Cóż, dziękuję! Cieszę się, że mogłem ci pomóc. – maba

1

Twoje rozwiązanie C# jest zależne od Visual Studio, ponieważ rozwiązanie Java będzie zależało od jego narzędzi.

Odpowiedź zależy również od opakowania: JAR dla komputera, WAR dla WWW, EAR dla przedsiębiorstwa z EJB.

Maven sprawia, że ​​wiele wyborów dla Ciebie, jeśli zdecydujesz się pójść w tym kierunku (na przykład struktury katalogów, etc.)

Eclipse oraz IntelliJ będzie zarówno zrobić to inaczej. IntelliJ używa koncepcji modułu, którą uważam za bardzo dobrą. Wolę to od Eclipse; Nie wiem, jak to się teraz robi w tym IDE.

+0

Dzięki, ale tak naprawdę nie widzę żadnej treści w tej odpowiedzi, której jeszcze nie było w tym temacie ... –

2

Moim sposobem jest użycie Maven dla obu:

  • zależnościami innej marki (zwykle poprzez Maven centralne)
  • Międzywydziałowych zależności pomiędzy różnymi projektami (zazwyczaj za pośrednictwem lokalnego repozytorium)

działa to całkiem dobrze i uważam, że jest niezależny IDE (chociaż ja tylko testowałem to na Eclipse)

N Uwaga:

Jeśli masz zespół pracujący razem na tych samych artefaktów trzeba będzie w pewnym stopniu mają wspólną repozytorium zawierającego je, chociaż można to zrobić po prostu przez np

+0

Czy to oznacza, że ​​musimy uruchomić nasz własny serwer Maven? –

0

rzeczywiście tworzyć różne projekty, które zostaną wdrożone jako inny JA r pliki; następnie, używając Mavena, te zależności można dodać tam, gdzie są potrzebne.

Maven zapewnia także niezależność IDE; istnieją wtyczki dla różnych IDE. Na przykład z

mvn idea:idea 

Maven automatycznie tworzy pliki projektu dla Intellij IDE.

+0

'' maven-idea-plugin' jest przestarzałe i nie powinno być używane. Wystarczy otworzyć projekt, wskazując plik 'pom.xml' z poziomu IntelliJ. To samo dla Eclipse, które teraz używa wtyczki m2e zamiast 'mvn eclipse: eclipse'. – maba

+0

Czy możesz podać jakieś argumenty lub referencje? – m3th0dman

+0

Cóż, nie zmniejszyłem ani o ciebie, chciałem poinformować, że istnieją lepsze sposoby na załadowanie projektów do różnych IDE. Ale do tej pory ["maven-idea-plugin"] (http://maven.apache.org/plugins/maven-idea-plugin/index.html) nie był aktywny od 2008 roku. Odnośnie 'mvn eclipse: eclipse 'tu są informacje [tutaj] (http://stackoverflow.com/questions/9227312/which-eclipse-wtp-version-ould-for-for -maven/9227934 #comment11690275_9227934) na przykład. – maba

-1

Rozwiązanie jest własnością Visual Studio, a nie .Net. W przyszłości zaćmienie może wspierać rozwiązanie (może być).

można naśladować pomysł rozwiązanie przy użyciu Workspace koncepcję w Eclipse

  1. Utwórz nowy obszar roboczy
  2. Importuj wszystkie projekty (pamiętaj, aby sprawdzić „projekt Kopiuj do przestrzeni roboczej, tak że fizyczna kopia jest tworzony)
  3. teraz, gdy otworzysz ten obszar roboczy, zawsze można zobaczyć cały projekt.

można również patrz inne projekty w przestrzeni roboczej za pomocą Build-> Configure Build Path -> Project i Dodaj Projekty

Jeśli chcesz „Wykluczenie z roztworu”, można zrobić to samo w Eclipse przez „zamykanie projektu”

+0

Jak powiedziałem, muszę być niezależna od IDE. –

2

Używając gradle, stworzysz jeden super-projekt i stworzysz różne moduły jako podprojekty. Stamtąd można tworzyć opisy obszaru roboczego/projektu dla różnych IDE.

Ponieważ gradle jest w pełni kompatybilny z repozytoriami stylu Maven, uwagi @ mikera dotyczące repozytoriów są również ważne.

+0

Czy ta praca dotyczy, powiedzmy, biblioteki Scala, aplikacji konsolowej Java i aplikacji internetowej Java w tym samym super-projekcie? –

+0

Jestem pewien, że to zadziała, ale nie mogę podać żadnych szczegółów. Najlepiej zapytaj ekspertów na [forach] (http://forums.gradle.org/gradle). –

+0

Miałem sztukę z Gradle i jest urocze, a na pewno obsługuje wieloprojektowe kompilacje jako pierwszorzędną rzecz. Podejrzewam, że przejdziemy do tego, gdy Maven staje się zbyt wielkim bólem, aby go spersonalizować! –

1

Użyj mulit-module (pom-packaging) projektu Maven w katalogu głównym struktury projektu, aby zbudować wszystkie źródła z Maven.

Następnie użyj obszarów roboczych (Eclipse) lub grup (NetBeans), aby wyświetlić podzestaw projektów, z którymi chcesz pracować.

+0

Nie przeszkadza mi tylko jest w stanie otworzyć jeden projekt/pakiet naraz.Czy możesz dać mi więcej informacji na temat tego, jak to zrobić w Maven? –

+0

Oto samouczek: http://www.sonatype.com/books/mvnex-book/reference/multimodule.html – Puce

Powiązane problemy