2011-11-09 9 views
5

मैं एक मंच के रूप में हेरोकू की जांच कर रहा हूं और इसे चलाने के लिए मूल जावा वेबपैप प्राप्त करने की कोशिश कर रहा हूं। वेबैप पहले से ही मेवेन (टोमकैट और कार्गो-मेवेन-प्लगइन का उपयोग करके) बनाता है और चलाता है, इसलिए मुझे लगा कि यह एक हवा होनी चाहिए क्योंकि हेरोकू अपने इंस्टॉलेशन/परिनियोजन कार्यों को प्रबंधित करने के लिए मेवेन का उपयोग करता है।हेरोकू - क्या मैं प्रोफाइल से मेवेन को कॉल कर सकता हूं?

हालांकि यह मामला नहीं है, क्योंकि मैं वास्तव में चीज शुरू करने में असमर्थ हूं। मेरे Procfile उस में निम्नलिखित है:

web: sh ./startServer-heroku.sh 

और startServer-heroku.sh बस है:

mvn clean install cargo:start -Dcargo.maven.wait=true 

यह ठीक काम करता है जब मैं Heroku ट्यूटोरियल डॉक्स में वर्णित के रूप में स्थानीय रूप से foreman start आदेश का उपयोग कर परीक्षण,। लेकिन जब मैं वास्तविक Heroku सर्वर पर कोशिश करते हैं, मैं निम्नलिखित लॉग संदेश प्राप्त:

2011-11-09T02:30:27+00:00 heroku[web.1]: State changed from created to starting 
2011-11-09T02:30:27+00:00 heroku[slugc]: Slug compilation finished 
2011-11-09T02:30:33+00:00 heroku[web.1]: Starting process with command `sh ./startServer-heroku.sh` 
2011-11-09T02:30:33+00:00 app[web.1]: ./startServer-heroku.sh: 1: mvn: not found 
2011-11-09T02:30:33+00:00 heroku[web.1]: Process exited 
2011-11-09T02:30:34+00:00 heroku[web.1]: State changed from starting to crashed 

ऐसा लगता है कि mvn कहीं नहीं है पर पाया जा करने के लिए सिस्टम के PATH, इसलिए आदेश विफल हो रहा है।

क्या हेरोोक Procfile से mvn को आमंत्रित करना संभव है? और क्या वहां कहीं भी ऐसे आदेशों की एक निश्चित सूची है जो Procfile से उपलब्ध नहीं हैं?

+0

[jcabi-heroku-maven-plugin] (http://www.jcabi.com/jcabi-heroku-maven-plugin/index.html) पर एक नज़र डालें, जो पूरे तैनाती प्रक्रिया को हरोकू में स्वचालित करता है। शायद यह आपके मामले में मदद करेगा। – yegor256

उत्तर

2

जेम्स का जवाब जेटी को हेरोकू पर काम करने के लिए अच्छे निर्देश प्रदान करता है, और उनकी टिप्पणी में एम्बेडेड टोमकैट का उपयोग करने के लिए एक अच्छे संदर्भ का एक लिंक शामिल है। लेकिन हेरोकू पर टॉमकैट के मानक, स्टैंडअलोन संस्करण को चलाने के लिए भी संभव है। यहाँ कैसे मैं यह काम करने के लिए प्राप्त करने में सक्षम था है:

 <plugin> 
      <groupId>org.codehaus.cargo</groupId> 
      <artifactId>cargo-maven2-plugin</artifactId> 
      <configuration> 
       <container> 
        <containerId>tomcat6x</containerId> 
        <zipUrlInstaller> 
         <url>http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip</url> 
        </zipUrlInstaller> 
        <dependencies> 
         <dependency> 
          <groupId>javax.activation</groupId> 
          <artifactId>activation</artifactId> 
         </dependency> 
         <dependency> 
          <groupId>javax.mail</groupId> 
          <artifactId>mail</artifactId> 
         </dependency> 
        </dependencies> 
       </container> 
       <configuration> 
        <type>standalone</type> 
        <deployables> 
         <deployable> 
          <groupId>com.yourcompany.name</groupId> 
          <artifactId>yourArtifact</artifactId> 
          <type>war</type> 
          <properties> 
           <context>ROOT</context> 
          </properties> 
         </deployable> 
        </deployables> 
       </configuration> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>install</goal> 
         <goal>configure</goal> 
         <goal>deploy</goal> 
         <goal>package</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
:

पहले, स्थापित बिलाव उदाहरण के लिए स्थापित करने के लिए और अपने निर्माण के हिस्से के रूप बिलाव कॉन्फ़िगर करें, और भी तैनात करने के लिए अपने आवेदन अपने पोम की स्थापना

इसके बाद, एक छंटनी डाउन server.xml फ़ाइल कि Heroku पर काम करेंगे बनाएँ:

<?xml version='1.0' encoding='utf-8'?> 
<Server port="-1"> 
    <Listener className="org.apache.catalina.core.JasperListener" /> 
    <Service name="Catalina"> 
     <Connector port="${http.port}" protocol="HTTP/1.1" connectionTimeout="20000"/> 
     <Engine name="Catalina" defaultHost="localhost"> 
      <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"/> 
     </Engine> 
    </Service> 
</Server> 

... यह आवश्यक है क्योंकि आपके Heroku एप्लिकेशन केवल एक ही बंदरगाह के लिए बाध्य करने के लिए (जो हर बार एक नया उदाहरण में परिवर्तन की अनुमति दी है बनाया गया है, औरमें निर्दिष्ट हैपर्यावरण चर)। किसी भी अन्य बंदरगाह से बांधने का प्रयास आपके ऐप को दुर्घटनाग्रस्त कर देगा। चूंकि बंदरगाह गतिशील है, इसे पर http.port सिस्टम प्रॉपर्टी के माध्यम से पारित किया जाना चाहिए, लेकिन हम बाद में उस पर पहुंच जाएंगे।

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="quiz_devel"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.archive.autodetection" value="class"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
     <property name="hibernate.show.sql" value="true"/> 
     <property name="hibernate.c3p0.acquire_increment" value="1"/> 
     <property name="hibernate.c3p0.idle_test_period" value="10"/> 
     <property name="hibernate.c3p0.max_size" value="20"/> 
     <property name="hibernate.c3p0.max_statements" value="40"/> 
     <property name="hibernate.c3p0.min_size" value="1"/> 
     <property name="hibernate.c3p0.timeout" value="30"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

नोट है कि वहाँ कोई hibernate.connection.url यहाँ निर्दिष्ट:

आप उस पर होते हैं, यह भी एक persistence.xml फ़ाइल कि Heroku के साथ काम करेंगे पैदा करते हैं। ऐसा इसलिए है क्योंकि हेरोोकू डेटाबेस यूआरएल निर्दिष्ट करता है कि आपके ऐप को $DATABASE_URL पर्यावरण चर में उपयोग करना चाहिए।

  1. यह:

    #point to the correct configuration and webapp 
    CATALINA_BASE=`pwd`/target/cargo/configurations/tomcat6x 
    export CATALINA_BASE 
    
    #copy over the Heroku config files 
    cp ./server-heroku.xml ./target/cargo/configurations/tomcat6x/conf/server.xml 
    cp ./persistence-heroku.xml ./target/cargo/configurations/tomcat6x/webapps/ROOT/WEB-INF/classes/META-INF/persistence.xml 
    
    #make the Tomcat scripts executable 
    chmod a+x ./target/cargo/installs/apache-tomcat-6.0.18/apache-tomcat-6.0.18/bin/*.sh 
    
    #set the correct port and database settings 
    JAVA_OPTS="$JAVA_OPTS -Dhttp.port=$PORT -Dhibernate.connection.url=$DATABASE_URL" 
    export JAVA_OPTS 
    
    #start Tomcat 
    ./target/cargo/installs/apache-tomcat-6.0.18/apache-tomcat-6.0.18/bin/catalina.sh run 
    

    यह चीजों के एक नंबर कर रही है:

    अब यह एक सरल खोल स्क्रिप्ट है कि पर्यावरण को कॉन्फ़िगर करता है और सब कुछ सेट अप ताकि बिलाव वास्तव में चला सकते हैं बनाने के लिए समय आ गया है सही जगह पर इंगित करने के लिए CATALINE_BASE सेट करके, अपने निर्माण के हिस्से के रूप में पैक किए गए कार्गो को कॉन्फ़िगरेशन और तैनाती कलाकृतियों का उपयोग करने के लिए टॉमकैट को बताता है।

  2. यह डिफ़ॉल्ट server.xml और persistence.xml फ़ाइलों को उनके heroku- विशिष्ट रूपों के साथ ओवरराइट करता है।
  3. यह टॉमकैट उदाहरण में सभी स्टार्टअप स्क्रिप्ट को चिह्नित करता है जो कि निर्माण के हिस्से के रूप में कार्गो को निष्पादन योग्य के रूप में स्थापित किया जाता है।
  4. यह हेरोोकू मंच द्वारा प्रदान किए गए पर्यावरण चर के आधार पर http.port और hibernate.connection.url के मानों को निर्दिष्ट करता है।
  5. अंत में, यह टॉमकैट चलाता है। ध्यान दें कि ऐसा करने के लिए आप startup.sh का उपयोग नहीं कर सकते हैं, क्योंकि startup.sh एक नई प्रक्रिया में टॉमकैट लॉन्च करेगा और फिर समाप्त हो जाएगा। हेरोोकू इसे समझ में नहीं आता है, और सोचता है कि startup.sh की समाप्ति टोमकैट प्रक्रिया को समाप्त कर रही है।

अंत में, अंतिम चरण में अपने Procfile अपने स्टार्टअप स्क्रिप्ट कॉल करने के लिए स्थापित करने के लिए है, की तर्ज पर कुछ:

web: sh startServer-heroku.sh 
इस दृष्टिकोण आप एक परियोजना है कि Heroku के साथ संगत है हो सकता है के साथ

, जबकि एक मानक जावा वेबपैप के रूप में स्टैंडअलोन चलाने की अपनी क्षमता को बनाए रखा है।

7

मैवेन स्लग में नहीं है जो डायनोस पर तैनात हो जाता है। यह केवल संकलन समय पर उपलब्ध है। तब Procfile होगा

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>appassembler-maven-plugin</artifactId> 
      <version>1.1.1</version> 
      <configuration> 
       <assembleDirectory>target</assembleDirectory> 
       <programs> 
        <program> 
         <mainClass>foo.Main</mainClass> 
         <name>webapp</name> 
        </program> 
       </programs> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>assemble</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

:

web: sh target/bin/webapp 

एक अन्य विकल्प maven-dependency-plugin और war पैकेजिंग है: इस से निपटने के लिए एक विकल्प appassembler-maven-plugin और jar पैकेजिंग का उपयोग करने के एक शुरुआत स्क्रिप्ट उत्पन्न करने के लिए है

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>org.mortbay.jetty</groupId> 
           <artifactId>jetty-runner</artifactId> 
           <version>7.5.3.v20111011</version> 
           <destFileName>jetty-runner.jar</destFileName> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Procfile के साथ:

web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war 
+0

धन्यवाद, यह समझ में आता है, हालांकि आपका उदाहरण जेटी का उपयोग कर रहा है। क्या आपको पता है कि टॉमकैट के साथ तुलनीय चीज करना संभव है? – aroth

+1

टोमकैट में जेटी-धावक के बराबर नहीं है, लेकिन आप अभी भी टोमकैट के साथ दो तरीकों से तैनात कर सकते हैं। एक एम्बेडेड टोमकैट का उपयोग कर रहा है। इस आलेख को जांचें जो अभी पोस्ट किया गया था: http://devcenter.heroku.com/articles/create-a-java-web-plication-using-embedded-tomcat –

0

हां, आप अपने प्रोफाइल से मेवेन को कॉल कर सकते हैं।

उदाहरण के लिए यदि आप चाहते हैं:

आप README.md file from the "heroku-buildpack-java" project में वर्णित के रूप जावा निर्माण पैक में 'संकलन' स्क्रिप्ट के लिए एक छोटा सा संशोधन करके अपने स्लग में Maven शामिल करने की ज़रूरत ऐसा करने के लिए अपने आवेदन में कार्यावधि में उपयोग करने के लिए उपलब्ध Maven आप बस का निर्माण करने के लिए निर्देशिका कैश निर्देशिका से इसे कॉपी करने के लिए है संकलन स्क्रिप्ट के निम्नलिखित लाइनों को जोड़कर:

for DIR in ".m2" ".maven" ; do 
cp -r $CACHE_DIR/$DIR $BUILD_DIR/$DIR 
done 

मैं added these lines आर मैवेन डाउनलोड के बाद, और BUILD_DIR में बदलने से पहले।

अपने Procfile में आप तो .maven/bin/mvn

आप एक विरूपण साक्ष्य (युद्ध/जार) आप जावा से या एक सर्वलेट कंटेनर में चला सकते हैं का निर्माण कर रहे हैं, तो आप शायद कुछ करना चाहिए कॉल कर सकते हैं अन्य उत्तरों के रास्ते के साथ, लेकिन अगर आपको वास्तव में मेवेन चलाने की ज़रूरत है, तो यह वही तरीका है।

संबंधित मुद्दे