ใช้ ant scriptdef regex รับ javascript.EvaluatorException

สภาพแวดล้อม : ANT 1.9.4 โดยใช้ scriptdef javascript เพื่อดึงหมายเลขเวอร์ชันจากชื่อไฟล์

ในไดเร็กทอรีที่เลือก ให้ค้นหาชื่อไฟล์ที่มีนามสกุล .jar รับชื่อไฟล์ทั้งหมด วนซ้ำแต่ละชื่อไฟล์เพื่อดึงสตริงเฉพาะ และแยกหมายเลขเวอร์ชันจากสตริงนั้น ฉันใช้ scriptdef javascript เพื่อให้บรรลุเป้าหมายนี้ รหัสถูกคัดลอกด้านล่าง

รูปแบบชื่อไฟล์คือ "GeneralService_V1.2.jar" & "GeneralService_V10.6_SSL.jar"

นิพจน์ Regex ที่ใช้ในการดึงข้อมูล Vx.x คือ "\V\[0-9]+\.\[0-9]+\" ( นี่เป็นเพียงสำหรับ รูปแบบชื่อไฟล์ที่สอง)

ฉันได้รับข้อผิดพลาด - javax.script.ScriptException: sun.org.mozilla.javascript.EvaluatorException: missing ; ก่อนคำสั่ง (#11) ในบรรทัดที่ 11

มันล้มเหลวที่บรรทัดรูปแบบ ฉันใช้คำสั่ง Pattern ที่ถูกต้องหรือนิพจน์ regex ผิดหรือไม่

    <scriptdef name="jarFiles" language="javascript"> 
    <element name="fileset" type="fileset"/>            
        <![CDATA[           
            importClass(java.io.File);
            importClass(org.apache.commons.io.FilenameUtils);
            importClass(java.util.regex.Pattern);
            importClass(java.lang.System);
            filesets = elements.get("fileset");
              for (i = 0; i < filesets.size(); ++i) {
                fileset = filesets.get(i);                  
                Pattern pat = Pattern.compile("_\\V\\[0-9]+\\.\\[0-9]+\\_");
                Matcher matcher = pat.match(fileset);
                if (matcher.find()) {
                    System.out.println(matcher.group(0)); //prints _Vx.x_
                    String currJarVersion = matcher.group(0);
                } else {
                    System.out.println("Match not found");
                }                
        ]]>
    </scriptdef> 
    <jarFiles>
        <fileset id="jars" dir="${svn.jar.path}">
              <include name="**/*.jar" />
        </fileset>  
    </jarFiles>                 

    <propertyregex property="currJarVersion"                       
                   regexp="_V"
                   replace=""
                   global="true" /> 
    <echo message="${currJarVersion}"/> 

person Lola    schedule 06.01.2015    source แหล่งที่มา


คำตอบ (1)


โค้ดนี้มีหลายสิ่งผิดปกติ... ประการแรก คุณได้ประกาศให้เป็น JavaScript แต่คุณใช้โครงสร้าง Java เช่น การประกาศตัวแปรที่พิมพ์ (Pattern pat = ...) ซึ่ง JavaScript ไม่อนุญาต ประการที่สอง นิพจน์ทั่วไปไม่ถูกต้อง คุณมีการหลีกแบ็กสแลชมากเกินไป ประการที่สาม วิธีการสร้าง Matcher จาก Pattern เรียกว่า matcher ไม่ใช่ match ประการที่สี่ คุณไม่สามารถใช้นิพจน์ทั่วไปกับ FileSet เช่นนี้ได้ คุณจะต้องแยกรายชื่อไฟล์ที่ FileSet ตรงกัน จากนั้นจึงใช้นิพจน์ทั่วไปกับแต่ละรายการตามลำดับ และสุดท้าย นั่นไม่ใช่วิธีที่คุณตั้งค่าคุณสมบัติ Ant จากสคริปต์

ฉันขอแนะนำให้ละทิ้ง scriptdef ไปเลยเพราะคุณสามารถทำแผนที่ได้ง่ายขึ้นด้วยสิ่งอำนวยความสะดวก Ant ดั้งเดิมเช่น pathconvert

<pathconvert pathsep="&#10;" property="currJarVersion">
  <fileset dir="${svn.jar.path}">
    <include name="**/*.jar" />
  </fileset>
  <regexpmapper from="^.*_V([0-9]+\.[0-9]+).*$$" to="\1" /><!-- $ doubled for Ant -->
</pathconvert>
person Ian Roberts    schedule 06.01.2015
comment
นี่เป็นครั้งแรกที่ฉันเจอ pathconvert มันทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ. - person Lola; 06.01.2015
comment
@Lola ดีใจที่ได้ช่วยและยินดีต้อนรับสู่ Stack Overflow โปรดทราบว่าเมื่อคุณได้รับคำตอบที่สามารถแก้ปัญหาของคุณได้ ถือเป็นมารยาทที่ดีที่จะ ยอมรับ โดยคลิกที่เครื่องหมายถูกทางด้านซ้าย สิ่งนี้แสดงให้ผู้อ่านรายอื่นเห็นได้อย่างรวดเร็วว่าปัญหาได้รับการแก้ไขแล้ว (และยังให้โบนัสชื่อเสียงแก่ทั้งผู้ถามและผู้ตอบด้วย) - person Ian Roberts; 07.01.2015
comment
ขออภัย เพิ่งเคยใช้ไซต์นี้ ฉันคลิกเครื่องหมายถูก ขอบคุณอีกครั้ง. - person Lola; 07.01.2015